Moba项目开发(一)打造网络通信系统-任务11:11.保证报文完整性的处理

文章目录

1.在BufferEntity解码的时候,先判断包体的大小:

1)若大于4则继续往下走,否则都是直接返回,
2)再判断除了包体大小,数据包是否还有32个字节,若有,表示包体是完整的

            //先判断包体的大小
            if (buffer.Length>=4)
            {
                //字节数组转化成int或者是long
                protoSize = BitConverter.ToInt32(buffer, 0);    //从0的位置,取四个字节转成int
                //若数据是完整的,改变isFull为true,表示收到的包是完整的
                if(buffer.Length == protoSize + 32)
                {
                    isFull = true;
                }
            }
            else
            {
                isFull = false;
                return;
            }

2.将发送ACK报文的业务数据包大小置为0

            //如果是ACK的话,包体大小应为0,业务数据大小为0
            if(isAck == true)
            {
                protoSize = 0;//发送的业务数据的大小
            }

3.处理业务逻辑时,先判断包体大小是否是完整的

                    //包体完整才进行业务逻辑的处理
                    if (bufferEntity.isFull)
                    {
                        //打印一下处理消息
                        //$能使消息格式化
                        Debug.Log($"处理消息,id:{bufferEntity.messageID}");
                        //处理业务逻辑
                        local.Handle(bufferEntity);
                    }

完整代码

        //在Updata里面进行调用,服务器可以开线程循环调用
        //处理报文的接口
        public void Handle()
        {
            if (awaitHandle.Count > 0)
            {
                UdpReceiveResult data;
                //若队列不为空,从中取出数据
                if (awaitHandle.TryDequeue(out data)
                {
                    //先反序列化一下收到的数据,存到data.Buffer里面,这个是个字节数组
                    //传递给local
                    BufferEntity bufferEntity = new BufferEntity(data.RemoteEndPoint, data.Buffer);
                    //包体完整才进行业务逻辑的处理
                    if (bufferEntity.isFull)
                    {
                        //打印一下处理消息
                        //$能使消息格式化
                        Debug.Log($"处理消息,id:{bufferEntity.messageID}");
                        //处理业务逻辑
                        local.Handle(bufferEntity);
                    }
                }
            }
        }
上一篇:[简单Moba射击系统]设计师日志笔记-----2021.03.14


下一篇:Moba项目开发(一)打造网络通信系统-任务8:08.创建代理对象实现发送逻辑