繁体   English   中英

通过套接字从 Java 客户端向 NodeJS 服务器发送字符串也会发送不需要的字符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM