出现粘包或者半包的原因是TCP是流式协议,消息无边界;针对这个问题我们提供了以下三个解决方案
方案一:固定消息长度
-
消息边界:按业务场景中可能出现的最长消息的长度作为服务器每次读取的消息长度
-
优点:实现简单
-
缺点:
- 数据包大小不好把握
- 对于传输数据长度比较小的消息浪费空间
方案二:分隔符
-
消息边界:分隔符本身
-
优点:空间不浪费,实现简单
-
缺点:
- 当内容本身出现分割符时需要转义,所以无论是发送还是接受,都需要进行整个内容的扫描。
方案三:数据长度 + 数据
有一个专门的字段存储消息的长度。作为服务端,接受消息时,先解析固定长度的字段(length字段)获取消息总长度,然后读取后续内容。
- 消息边界:数据长度
- 优点:精确定位数据,内容也不需要转义
- 缺点:
- 长度上有一定的限制,需要提前限制可能的最大长度从而定义长度占用字节数。