Unity网络通信中对消息包的分包处理

简单分包
无论客户端还是服务端 接收数据时收到了消息的长度(消息的构成 消息长度int/消息头short/消息体byte[]) 传入处理分包的函数中 定义接收缓存区的有效长度初始为0 有效长度+=消息长度 判断有效长度是否大于4 如果小于4说明为残包不做处理 如果大于4继续执行函数;通过BitConvert.toInt32从缓存区的0位开始读 读4位把消息长度读出来 这个int值(leng)就是消息头+消息尾的长度 用该int值和有效长度-4比较 判断是否为整包 如果该int值>有效长度-4 说明街道的有效长度并不够一个整包 反之则继续执行函数;最终处理的是消息体中的数据 所有把缓存区的数组拷贝到消息体数组中 而消息体数组的长度就是leng-2(消息头+消息尾减去消息头 只剩下消息尾)拷贝时用Array.Copy从缓存区的第6个字节(消息长度+消息头)开始从0拷贝到消息体数组中长度为leng-2 当一个整包数据处理完毕之后 要把缓存区的数据位置前置 从缓存区的leng+4(消息长度+消息头+消息尾)到缓存区从0开始有效长度-4-leng(缓存区长度-整包长度)并更新缓存区的有效长度
粘包现象
当连接到服务端一个客户端时 服务端发消息为客户端分配1个id 服务端记录id数量 如果够2个则开一个房间发送消息给客户端跳场景 当第2个客户端连接上服务端时 服务端要分配id了 但同时 也满足了开房间的条件 则第二个id分配和开房间的消息极易粘包 导致客户端收不到整包无法跳场景 解决:可以分包 或者 服务端不要连接一个分配一次id 而是存储足够开房间的条件时 一同分配id

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值