1数据包
在传输网络数据的时候,接收方一次收到的数据长度可能是不确定的,比如客户端发送了100个字节给服务器,服务器有可能一次收到100个字节,也可能先收到20个,再收到80个。为了知道到底一个数据的长度是多少,我们将首先创建一个类,用于管理序列化的数据流,序列化、反序列化对象。
NetPacket这个类提供的功能主要包括两部分:一部分是将序列化的数据写入,并加入4个字节作为数据的“头”;另一部分是从byte数组的前4个字节解析数据长度,再读取相应长度的数据。这里是把protobuf的序列化处理。
1.1protobuf序列化
1.protobuf序列化为byte数组
/// <summary>
/// protobuf序列化成byte
/// </summary>
/// <typeparam name="T">protobuf的类</typeparam>
/// <param name="t">protobuf值</param>
/// <returns>protobuf序列化后的byte数组</returns>
public byte[] ProtoRuntimeSerialize<T>(T t)
{
byte[] bs;
using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
{
ProtoBuf.Meta.RuntimeTypeModel model = ProtoBuf.Meta.RuntimeTypeModel.Create();
model.Serialize(stream, t);
bs = stream.ToArray();
}
return bs;
}
2.byte数组写入数据流