粘包半包的解决方法

粘包半包的解决方法
L X Y什么是粘包?
是指如果当发送端快速发送多条数据,但是接收端没有及时调用Receive,那么数据会在接收端的缓存中积累。
例如:当发送端先发送“1,2,3,4”四个字节,紧接着又发送“5,6,7,8”四个字节的数据;等到接收端调用Receive的
时候,接收端的操作系统已经将接收到的全部数据写入缓存区,共接收到“8”个字节。
什么是半包?
也就是当发送端发送的数据太长了,但是接收端的缓存区没有足够的空间接收全部数据,就会接收一部分数据,另一
部分等下一次调用Receive的时候在接收。
例如:发送端发送:asdfghjkl,但是接收端只剩下三个字节的空间,此时接收端接收“asd”,等到下一次调用Receive时再
接收fghjkl。
解决方法:
一.长度信息法:
在每一个数据包前面加上长度信息,每次接收到数据包后先读取表示长度的字节,如果缓存区的数据长度大于要取的字
节数,则取出相应的字节,否则等待下一次数据接收。
二.固定长度法:
每次都以固定的长度发送数据,若大小 “小于” 固定长度,则可以填入一些事先约定的符合占位凑数。
三.结束符号法:
规定一个结束符号,作为消息间的分隔符;将每次接收到的消息字节,通过结束符分开。
例如:规定一个结束符为“$” ;若接收到一条消息字节为“Helloworld$Iam”,则接收端先处理数据“Helloworld”,保留“Iam”
等到下一个“$”出现,将“Iam”和下一个“$”之间的数据粘在一起,作为一条完整的消息。







