消息协议规则.md 4.7 KB

消息协议规则

  1. 消息版本号: magic/level = 1

  2. 消息协议类型(MsgType)

       public enum MsgType
       {
           HEART_BEAT = 0, //心跳
           REQUEST = 1, //客户端请求
           RESPONSE = 2, //服务端应答
           PUSH = 3 //服务端推送
       }
  1. 消息头规则(MessageHead)

    • HEART_BEAT:

    心跳包固定长度2字节

    byte[0] = magic

    byte[1] = 0

             //heart 2
             //| magic |  type | compress | encryption |0000|
             //| 1byte |  2bit |   1bit   | 1bit       |4bit|
             //|   0   |           1                        |
    
    • REQUEST/RESPONSE

    头部长度为12字节, int类型按照从左到右的顺序写入

             //request || response  12
             //|<-                   Head                                    ->|<-      Body      ->|   
             //| magic |  type | compress | encryption |0000|  seqID   | protoId| msglength|   msg   |
             //| 1byte |  2bit |   1bit   | 1bit       |4bit|  4byte   | 4byte  |  2byte   |  Nbyte  |
             //|   0   |           1                        | 2 3 4 5  | 6789   |  10 11   |         | 
    
    • PUSH

    头部长度为8字节, int类型按照从左到右的顺序写入

             //push 8
             //|<-                   Head                         ->|<-       Body     ->|  
             //| magic |  type | compress | encryption |0000| protoId| msglength|   msg   |
             //| 1byte |  2bit |   1bit   | 1bit       |4bit| 4byte  |  2byte   |  Nbyte  |
             //|   0   |           1                        | 2345   |  6  7    |         |
    
    1. #### Protobuf规则
    • 客户端使用proto3定义消息结构和生成代码,proto文件开头固定为: syntax = "proto3";

    • proto文件名为:*.proto,文件名全小写字母,使用下划线做拼接符。如:lower_snake_case.proto

    • 对消息名称使用 PascalCase(以大写字母开头):SongServerRequest。优先将缩写大写为单个单词:GetDnsRequest 而不是 GetDNSRequest。对字段名称使用 lower_snake_case,包括 oneof 字段和扩展名:song_name

     syntax = "proto3";
         
     package proto;
     import "model/activity.proto";
         
         
     //id=10001
     message SongServerRequest {
       string song_name = 1;
     }
     //id=10001
     message SongServerResponse {
       sint code = 1;
       string msg = 2;
     }
     //id=10003
     message SongServerPush {
         sint id = 1;
     }
    
    • 消息协议名字以:Request、Response、Push作结尾,对应上文的消息协议类型,同时在名字上一行以注释的方式设置其protoId。同时Request和Response的名字应该成对定义,protoId相同。

    • Response消息必须包含两个固定字段: code、msg

    • proto文件按照功能模块划分,每个功能模块一个proto文件,模块用数据结构/枚举等可以单独划分一个专门的proto文件

    • proto文件之间有引用的使用 import语句导入,如: import "model/activity.proto";

    • 常用数据类型:float、double、sint32、sint64、uint32、uint64、bool、string,不要使用int32、int64。数组在数据类型前加前缀: repeated

    • 自定义枚举,默认值是第一个定义的枚举值,它必须是 0

    • 自定义枚举和数据结构必须在使用前定义

     //id=12801
     message PersonRequest
     {
         string name = 1; //名字
         sint32 id = 2; //编号
         enum Sex
         {
            male = 0;
            female = 1;
         }
         Sex sex = 3;
         repeated string friends = 4;
         message Data
         {
            sint key = 1;
            string value = 2;
         }
         Data data = 5;
     }
    
    • 飞龙项目暂定用json序列化,屏蔽 oneof、map等特殊用法

    • 命名空间默认使用批处理参数(--package)设置,如:--package=FL.Network,也可以在proto文件里主动设置, 如:package FL.Network;

    • 代码生成工具使用protobuf-net

    参考链接:

    protobuf git地址

    protobuf文档

    protobuf-net git地址

    protobuf-net 使用

    1. #### 微信小游戏
    • 微信小游戏不支持System.Net接口,HTTP使用UnityWebRequest,WebSocket通信替代(如开源的UnityWebSocket插件),UDP/TCP使用WX SDK适配
    • UnityWebSocket地址
    1. 未完待续