scoket 字节流传输粘包,分包处理

分包

分包, 传输过程中对一个报文进拆分发送。比如传输一个字符串“aabbcc”,那么在接收方可能先收到aa 然后 bb 最后cc。​

粘包

粘包,是指发送端发送的两个报文,在接收端被拼在一起。由于TCP是面向流的协议,报文与报文之间是没有分界符号的。在接收端,所有的数据都逻辑上拼在一起给你。举例来说,你分10次发送10个长度为10的报文,在接收端,你可能只收到一个长度为100的报文,而不会收到10个消息。

解决方法

分包解决方法:发送消息前先把消息的长度发送出去,这个长度可以定义成一个固定的字节长度,接收的时候先接收长度,根据这个值判断是否已经接收完毕,没接收完等待下一次的接收内容,长度达到就可读取整条消息处理了。

粘包解决方法:同分包一样可以先将消息的长度发送过去,在接收之后,先拿消息的长度,然后根据长度获取消息内容。剩下的部分在获取长度,如果长度够的话,继续处理消息,如果获取长度后发现不够等待下次接收进行处理。

算法:

  1. 接收到字节流后进入循环
  2. 判断当前字节流里的长度是否够消息长度的字节如果不足退出循环等待下一次接收,如果够进入3
  3. 获取长度,判断剩余字节流是否够用,如果不够用,将长度字节原样放回字节流,跳出循环,如果足够进入4
  4. 取出当前长度的字节流,进行消息解析
  5. 继续循环

代码实现如下:

评论已关闭。

分类目录