【发布时间】:2020-03-30 00:35:37
【问题描述】:
我已经阅读了堆栈的所有内容,但我找不到一个可行的解决方案来确定数据包大小并将字节数组设置为匹配该长度以一次接收一条消息的正确字节数。
DataInputStream in = new DataInputStream(socket.getInputStream());
while(true) {
short myShortStreamSize = in.readShort();
byte[] payload = new byte[myShortStreamSize];
in.readFully(payload);
Log.i("Foo", new String(payload));
}
That 不适合我。
我的 TLS 服务器是用 Node.js 制作的。通常,如果我使用相同的模块连接到服务器,Node.js TLS 模块会以这种方式处理数据包,使用 socket.write("message") 就足够了,并且 Node.js 客户端已经了解大小,因此您不需要自己定义它.它会将该消息写入控制台而不会出现问题。正如我提到的,我的服务器是 TLS。我不确定这些是否与我的问题有关,但让它发挥作用会很棒。
我的目标是一次接收一条消息,而不是将其切割成碎片。如果我发送“早上好,今天是晴天!”我希望我的 Java/Android 客户端从头到尾读取它,而不会与其他数据包混淆。
【问题讨论】:
-
你试过
while( (numBytes = read(payload)) >= 0 )而不是你的循环吗? -
你能澄清一下吗?
-
@EugèneAdell 试试看,为什么?这将传递整个输入流,而不是一条消息。
-
您正在接收一个 16 位长度的字,但您要发送它吗?
-
我重复一遍。您是否在每条消息之前发送一个 16 位长度的字?如果你不是,你上面的代码没有意义。这是解决您的问题的最简单方法。所有这些关于空字节的东西都不是,除非你再次发送空字节作为消息终止符并且它们不会出现在消息中。