最近看了非常多精彩的socket文章,让我获益不少。但依然没法完全解决粘包的问题。
客户端,封包。把数据用一个类封装起来,此数据应该分为三个部分,分别为包头,包身,包尾(这个我没有用到)。其中包头包括了协议类型和数据长度,包身就是数据了。
服务端,拆包。先建立一个固定长度的缓冲区,当数据把这个缓冲区填充后,分析包头,把类型和长度(假设为M)取出。把包身(假设长度为N)截取M字节。如果M =N,则数据包完整。如果M > N,数据包不完整,继续循环接收。如果M<N,有完整数据包,但还有第二个包紧跟其后(粘包)。