粘包问题
TCP服务特点
粘包
多次数据发送, 多次发送的数据首位相连, 接收端接收的时候不能正确区分第一次发送多少, 第二次发送多少。
比如对方连续发送两次数据,然后读数据的时候第一次没有读完,剩余的数据会在第二次读走,第一次读取数据不完整导致剩余数据归并到第二次读取的数据,这种情况就属于粘包。
粘包的产生会对后面数据的逻辑判断产生影响,但对于粘包的处理取决于粘包是否有影响,如果粘包会产生影响就需要我们去解决,没有影响可以选择不解决(比如文件传输没有影响)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nvUaHglu-1667544827292)(C:\Users\Iric Zhang\AppData\Roaming\Typora\typora-user-images\image-20221104143834778.png)]
解决粘包的方法
(1)报头 + 数据
报头可以用前四个字节表示长度,之后的的长度表示数据内容
例如:4位的数据长度+数据 -----------> 0010 1234567890
其中0010表示数据长度, 1234567890表示10个字节长度的数据,另外, 发送端和接收端可以协商更为复杂的报文结构, 这个报文结 构就相当于双方约定的一个协议
(这种方式是项目中使用最多的方法,不会发生错误)
(2)添加结尾标记
需要发送方和接收方协商确定,效率比较低,所以不建议使用
例如:协商确定每次发送数据的最后一个字符为\n\ $等
(3)数据包定长
每次发送数据的长度以及数据内每一段的内容都需要双方协商确定,相当于数据部分的协议,开发中叫做规约或者接口文档,也叫做接口
这种方式使用不多,因为在不同业务下对于数据的规定不同,使用定长数据不适合在之后业务中去使用
例如:发送方和接收方约定, 每次只发送128个字节的内容, 接收方接收定长128个字节就可以了