通讯协议实现有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(二)去讲。
原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/268050.html