socket笔记4 粘包/分包的原因和处理方法 // 多线程

2-60 解决粘包、分包问题

粘包原因:

  1. 当发送的字节数据包比较小且频繁发送时,Socket内部会将字节数据进行粘包处理,既将频繁发送的小字节数据打包成 一个整包进行发送,降低内存的消耗。
  2. 发送端发送的太快,接收方没有及时接收缓冲区的包,造成多个包一起被接收

分包原因:

  1. 当发送的字节数据包比较大时(大于缓存剩余空间大小 或者 大于最大报文长度),Socket内部会将发送的字节数据进行分包处理

处理方法:

  1. 发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。

  2. 发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。

  3. 可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。

https://github.com/surserrr/learn_socket/commit/851a406dc498914c094bb0f821ce8fe41ce1a538

2-80

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity实现Socket通讯时,常常会遇到TCP和拆的问题。下面我将介绍在Unity中如何解决这些问题。 TCP是指在传输过程中,由于数据缓冲区的限制,多个小的数据可能会被合并成一个大的数据,导致数据的解析和处理出现问题。为了解决这个问题,可以通过以下两种方式来处理。 第一种方式是定长头+体的设计。即在数据前面添加一个固定长度的头,头中含了体的长度信息。接收方在接收数据时,首先读取头的长度信息,然后再根据长度信息读取相应长度的数据进行解析和处理。 第二种方式是使用特殊的字符序列作为的分隔符。例如,在每个数据的末尾添加一个换行符或其他不常用的字符作为分隔符。接收方在接收数据时,通过查找这个分隔符来确定的结束位置,然后对数据进行解析和处理。 TCP拆是指在传输过程中,一个大的数据可能会被拆分成多个小的数据,导致数据的解析和处理出现问题。为了解决这个问题,可以通过以下方式来处理。 可以在接收方使用缓冲区来接收数据,并且设置一个最大接收长度。当接收到的数据长度小于最大接收长度时,将数据放入缓冲区中,并在缓冲区中进行数据的拼接。当接收到的数据长度大于等于最大接收长度时,对缓冲区中的数据进行解析和处理,并清空缓冲区。 以上是Unity实现Socket通讯时解决TCP和拆问题的方法。希望对你有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值