粘包半包的解决方法

什么是粘包?

 是指如果当发送端快速发送多条数据,但是接收端没有及时调用Receive,那么数据会在接收端的缓存中积累。

例如:当发送端先发送“1,2,3,4”四个字节,紧接着又发送“5,6,7,8”四个字节的数据;等到接收端调用Receive的
时候,接收端的操作系统已经将接收到的全部数据写入缓存区,共接收到“8”个字节。

什么是半包?

 也就是当发送端发送的数据太长了,但是接收端的缓存区没有足够的空间接收全部数据,就会接收一部分数据,另一

部分等下一次调用Receive的时候在接收。
例如:发送端发送:asdfghjkl,但是接收端只剩下三个字节的空间,此时接收端接收“asd”,等到下一次调用Receive时再
接收fghjkl。

解决方法:

一.长度信息法:

 在每一个数据包前面加上长度信息,每次接收到数据包后先读取表示长度的字节,如果缓存区的数据长度大于要取的字

节数,则取出相应的字节,否则等待下一次数据接收。

二.固定长度法:

 每次都以固定的长度发送数据,若大小 “小于” 固定长度,则可以填入一些事先约定的符合占位凑数。

三.结束符号法:

 规定一个结束符号,作为消息间的分隔符;将每次接收到的消息字节,通过结束符分开。

例如:规定一个结束符为“$” ;若接收到一条消息字节为“Helloworld$Iam”,则接收端先处理数据“Helloworld”,保留“Iam”
等到下一个“$”出现,将“Iam”和下一个“$”之间的数据粘在一起,作为一条完整的消息。