通讯协议实现有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(二)去讲。