收到的填塞数据,哪里是数据的终点

本文关键字:数据 终点 | 更新日期: 2023-09-27 18:13:51

我有聊天应用程序,具有多个客户端一个服务器。我想接收分离和完整的数据,数据可以是文本(字符串)或文件(字节)。为例。Client1发送data1(文本)和data2(图像)。作为同一时间。服务器将这两条消息作为一条消息接收(data1data2)。

我怎么知道数据在哪里结束?

我的解决方案,我已经尝试过,但不工作,是:增加END_OF_PACKET字符串,当客户端发送数据时转换为byte[]。当我把数据当作byte[]时,它有时会起作用。

我可以使用什么方法来完成这个工作?

收到的填塞数据,哪里是数据的终点

当我把数据当作byte[]时,

有时会起作用。

这是因为一个byte[]有一个固定的编码,它是你的字符串的原始版本,所以如果你编码(string -> byte[])你的消息在一个特定的字符集(让我们说UTF-8),你必须解码(byte[] -> string)与相同的字符集(UFT-8)检索原始消息。


我怎么知道数据在哪里结束?

因为你也想传递二进制数据,你不应该使用"END_OF_PACKET"解决方案。
为什么?因为在二进制数据中可能有一个(或多个)匹配这个字符串,所以将二进制数据视为不可预测的,并使用所有可能的字符。

这是另一个解决方案:
用一个数字开始你的消息,这个数字将代表消息长度+一个分隔符(而不是一个数字)来知道数字的结束位置,然后添加你的数据(二进制或非二进制)。

语法:<length><separator><data>
分隔符=";":
4;Hello19;Look at this image!20;jœÿJ¯ÿTÀÿRŒ»ÿP‰»ÿ=kF

在前面的例子中有3个数据:
1. 4;Hello
2. 19;Look at this image!
3.20;jœÿJ¯ÿTÀÿRŒ»ÿP‰»ÿ=kF