前言
不管是走命名管道还是TCP/IP的方式,都会有粘包的问题发生。粘包的产生的原因可以这么理解:客户端与服务器维持一个长连接,在连接不断开的情况下,可以持续不断地进行数据的交互。一个完整的包可能被TCP拆分为多个包进行发送,也可能把多个小包封装成一个大的数据包进行发送。
粘包的情况有几种:
- 收到一个完整的包,没有粘包
- 收到一个完整的包和下一个包的一部分
- 收到上一个包的一部分和下一个完整的包
- 收到一个包的一部分(完整的包太大,被拆分成多个包)
解决方案
常见的解决方案有几种
- 消息定长:即限制每个包的大小,如果不够,用空格补齐。这种方式,需要注意待发送数据小于MSS(最大报文长度),不然还是会被分包
- 在包尾增加特殊字符进行分割。这种方式,需要注意待发送数据里边本身包含特殊字符的情况
- 自定义协议,消息分为消息头和消息体两部分,消息头包含消息的总长度。这种方式,需要自己去解析每个消息头获取消息的总长度,然后再进行处理
Comments