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

你可能感兴趣的:(Unity网络通信中对消息包的分包处理)