[英]Sending String from Java client to NodeJS server via socket also sends unwanted characters
我想使用套接字将一个字符串数组从我的 Java 客户端发送到我的 NodeJS 服务器。 我的意图更复杂,但我认为一切都可以简化为下一行代码:
爪哇
Socket s = new Socket("localhost", 6666);
DataOutputStream dout = new DataOutputStream(s.getOutputStream());
dout.writeUTF("test"); // also tried writeChars and writeBytes
节点
require('net').createServer(function (socket) {
console.log("connected");
socket.on('data', function (data) {
console.log(data.toString())
});
}).listen(6666);
简单地运行服务器,然后是客户端,我得到:
我知道我发送数据的方式有问题。 也许它需要某种序列化,但我找不到一些明确的步骤来做到这一点。 谢谢你。
使用 OutputStreamWriter 而不是 DataOutputStream:
Socket s = new Socket("localhost", 6666);
OutputStreamWriter out = new OutputStreamWriter(s.getOutputStream(), StandardCharsets.UTF_8);
out.write("test");
out.flush();
DataOutputStream
旨在与DataInputStream
Java 类一起使用,它们使用的数据交换格式有些不标准。 这尤其适用于writeUTF
方法:它首先将字符串的长度写入 2 字节二进制数。 然后它使用非标准字符编码写入字符串的字符。
如果您正在与不是用 Java 编写的软件交换信息,那么不使用 DataOutput/InputStream 类会更容易。
根据我的经验,通过 Socket 发送字符串的最安全方法是发送它的字节数组,如下所示:
public static void main(String[] args) {
try (Socket s = new Socket("localhost", 6666)) {
DataOutputStream dout = new DataOutputStream(s.getOutputStream());
dout.writeUTF("test utf");
dout.writeUTF("hello from ☕");
dout.writeUTF("\n");
dout.write("test byte[]".getBytes());
dout.write("hello from ☕".getBytes());
dout.write("I support unicode ✁ ✂ ✃ ✄ ✆".getBytes());
} catch (IOException ioe) {
// do nothing
}
}
但即使通过复制您的代码,我也无法重现未知字符:
~/Projects/scratch via ⬢ v12.18.3
➜ node server.js
connected
test utfhello from ☕
test byte[]hello from ☕I support unicode ✁ ✂ ✃ ✄ ✆
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.