文章目录
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);
}
}
}
}