public enum MsgType
{
HEART_BEAT = 0, //心跳
REQUEST = 1, //客户端请求
RESPONSE = 2, //服务端应答
PUSH = 3 //服务端推送
}
心跳包固定长度2字节
byte[0] = magic
byte[1] = 0
//heart 2
//| magic | type | compress | encryption |0000|
//| 1byte | 2bit | 1bit | 1bit |4bit|
//| 0 | 1 |
头部长度为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 | |
头部长度为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 | |
客户端使用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
参考链接: