收到的数据填满了,数据的结尾在哪里?

时间:2015-09-21 15:43:56

标签: c# sockets tcp

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

我如何知道data1的结束位置?

我的解决方案我尝试过但没有工作,是: 添加“END_OF_PACKET”字符串,当客户端发送数据时,该字符串转换为byte []。 有时它在我将数据视为byte []时有效。在字符串上失败。

我可以使用哪些方法来完成这项工作?

1 个答案:

答案 0 :(得分:2)

  

有时它在我将数据视为byte []时有效。在字符串上失败。

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

  

我如何知道data1的结束位置?

由于您还想传递二进制数据,因此不应使用“END_OF_PACKET”解决方案 为什么?因为在二进制数据中可能存在一个(或多个)此字符串的匹配项,所以将二进制数据视为不可预测并使用所有可能的字符。

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

语法:<length><separator><data>
使用separator =“;” :
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