通讯协议及Google.Protobuf(一)

通讯协议实现有2种方式 一种是我们自己用struct(结构体),一种用第三方Google.Protobuf。

通讯协议一般都是转化为byte字节发送给服务端,所以需要封装一个 常用数据类型 与byte 可读可写的转换这么一个类。

举个例子:

short  与byte转换:

 1     public void WriteShort(short value)
 2     {
 3         byte[] datas = System.BitConverter.GetBytes(value);
 4         base.Write(datas, 0, datas.Length);
 5     }
 6 
 7     public short ReadShort()
 8     {
 9         byte[] data = new byte[2];
10         base.Read(data, 0, 2);
11         return System.BitConverter.ToInt16(data, 0);
12     }

其他了类型 ushort、long、ulong 等等大家自行实现一下比较简单。比如封装好的这个类叫:TestMemoryStreamUtil

在收发协议进行黏包拆包(后续我们会讲解) 依然需要用到此类。

第一种 struct(结构体)实现通讯解析,进行序列化和反序列化。

举个例子:

 1 public struct Proto_2
 2 {
 3     public string name;
 4     public int age;
 5     public string sex;
 6 
 7     public byte[] ToArray()
 8     {
 9         TestMemoryStreamUtil MemoryStreamUtil = new TestMemoryStreamUtil();
10         MemoryStreamUtil.WriteUTF8String(name);
11         MemoryStreamUtil.WriteInt(age);
12         MemoryStreamUtil.WriteUTF8String(sex);
13         return MemoryStreamUtil.ToArray();
14     }
15 }

 

序列化:转化为byte字节, 数据长度为20

1  Proto_2 proto_2 = new Proto_2();
2  proto_2.age = 10;
3  proto_2.sex = "girl";
4  proto_2.name = "xiaoming";
5  msgData = proto_2.ToArray();
6  Debug.LogError("msgData .Length = " + msgData.Length);//打印长度 20

 

反序列化:

1  MemoryStreamUtil.Write(msgData, 0, msgData.Length);
2  MemoryStreamUtil.Position = 0;
3  string name = MemoryStreamUtil.ReadUTF8String();
4  int age = MemoryStreamUtil.ReadInt();
5  string sex = MemoryStreamUtil.ReadUTF8String();
6  Debug.LogError(string.Format("name = {0},age={1},sex ={2}", name, age, sex));

注意:反序列化读取的顺序和写入顺序要一致,否则解析出来的数据就不对了。 当然这些繁琐的工作,我们最好使用工具自动生成,提高工作效率。

 

Google.Protobuf的内容比较多,在 通讯协议及Google.Protobuf(二)去讲。

 

 

posted @ 2022-06-16 08:36  赵不灰  阅读(539)  评论(0编辑  收藏  举报