## 消息协议规则 1. #### 消息版本号: magic/level = 1 2. #### 消息协议类型(MsgType) ```c# public enum MsgType { HEART_BEAT = 0, //心跳 REQUEST = 1, //客户端请求 RESPONSE = 2, //服务端应答 PUSH = 3 //服务端推送 } ``` 3. #### 消息头规则(MessageHead) - HEART_BEAT: 心跳包固定长度2字节 byte[0] = magic byte[1] = 0 ```c# //heart 2 //| magic | type | compress | encryption |0000| //| 1byte | 2bit | 1bit | 1bit |4bit| //| 0 | 1 | ``` - REQUEST/RESPONSE 头部长度为12字节, int类型按照从左到右的顺序写入 ```c# //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类型按照从左到右的顺序写入 ```c# //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 | | ``` - 4. #### Protobuf规则 - 客户端使用proto3定义消息结构和生成代码,proto文件开头固定为: **syntax = "proto3";** - proto文件名为:*.proto,文件名全小写字母,使用下划线做拼接符。如:lower_snake_case.proto - 对消息名称使用 PascalCase(以大写字母开头):SongServerRequest。优先将缩写大写为单个单词:GetDnsRequest 而不是 GetDNSRequest。对字段名称使用 lower_snake_case,包括 oneof 字段和扩展名:song_name ```c# 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 - 自定义枚举和数据结构必须在使用前定义 ```c# //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地址](https://github.com/protocolbuffers/protobuf.git) [protobuf文档](https://protobuf.com.cn/reference/) [protobuf-net git地址](https://github.com/protobuf-net/protobuf-net) [protobuf-net 使用](https://zhuanlan.zhihu.com/p/573019243) 5. #### 微信小游戏 - 微信小游戏不支持System.Net接口,HTTP使用UnityWebRequest,WebSocket通信替代(如开源的UnityWebSocket插件),UDP/TCP使用WX SDK适配 - [UnityWebSocket地址](https://github.com/wechat-miniprogram/minigame-unity-webgl-transform.git) 6. 未完待续