• 通讯协议及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(二)去讲。

     

  • 相关阅读:
    MySQL之PXC集群
    MySQL大表查询未走索引异常分析
    Redis场景应用之UA池
    MySQL日志剖析
    Redis场景应用之排行榜
    MySQL B+树索引解析
    Redisson分布式锁剖析
    关键字替代符号C++
    并查集按秩合并
    POJ3048
  • 原文地址:https://www.cnblogs.com/zhaolaosan/p/16380615.html
Copyright © 2020-2023  润新知