protobuf消息定义原则

2020-05-08 09:33

录[-] ? 1. 使用 protobuf 的enum定于消息的编号,也就是消息的类型。 ? 2. 会为每个具有消息体的消息定义一个对应的protobuf message。例如Login_Request会有一个对应LoginRequest消息。 ? 3. 会为每个消息大类定义一个消息,例如命令消息全部包含在message Command中,请求消息全部包含在Request消息中,应答消息全部包含在Response消息中,指示消息全部包含在Indication消息中。 ? 4. 对于应答消息,并非总是成功的,因此在应答消息中还会包含另外2个字段。一个用于描述应答是否成功,一个用于描述失败时的字符串信息。 对于有多个应答的消息来说,可能会包含是否为最后一个应答消息的标识。应答的序号(类似与网络数据包被分包以后,协议要合并时,需要知道分片在包中的具体位置)。因此Response看起来想这样: ? 5. 最后我会定义一个大消息,把Command、Request、Response、Indication全部封装在一起,让后在通信的时候都动大消息开始编解码。大消息看起来想下面这样。。 ? 6. 发送数据和接收数据。 ? 6. 消息处理(C++) ? 7. wireshark抓包 1

网络通信涉及到消息的定义,不管是使用二进制模式、xml、json等格式。消息都可以大体的分为 命令消息、请求消息、应答消息和指示消息4大消息类型。一般情况下每个消息还还有包含一个序列号和一个能够唯一区分类型类型的消息编号,编号可以使用字符串、整数或者枚举等。

1. 使用 protobuf 的enum定于消息的编号,也就是消息的类型。

我会为每个系统都定义一个MSG枚举。包含系统用到的所有消息的枚举编号

01 enum MSG 02 {

03 Login_Request = 0x00001001; 04 Login_Response = 0x00001002; 05

06 XXX_Request = 0x00001003; 07 XXX_Request = 0x00001004; 08

09 XXX_Command = 0x00002001; 10

11 XXX_Indication = 0x00003001; 12 }

2. 会为每个具有消息体的消息定义一个对应的protobuf message。例如Login_Request会有一个对应LoginRequest消息。

1 message LoginRequest 2 {

3 required bytes username = 1; 4 required string password = 2; 5 }

3. 会为每个消息大类定义一个消息,例如命令消息全部包含在message Command中,请求消息全部包含在Request消息中,应答消息全部包含在Response消息中,指示消息全部包含在Indication消息中。

也就是我会有下面4个protobuf message:

01 message Command

02 {// 包含所有的 XXXCommand 消息 03 }

04 message Request

05 {// 包含所有的 XXXRequest消息 06 }

07 message Response

08 {// 包含所有的Response消息 09 }

10 message Indication

11 {// 包含所有的Indication消息。 12 }

4. 对于应答消息,并非总是成功的,因此在应答消息中还会包含另外2个字段。一个用于描述应答是否成功,一个用于描述失败时的字符串信息。 对于有多个应答的消息来说,可能会包含是否为最后一个应答消息的标识。应答的序号(类似与网络数据包被分包以

后,协议要合并时,需要知道分片在包中的具体位置)。因此Response看起来想这样:

1 message Response 2 {

3 required bool result = 1;

4 optional bytes error_description = 2; 5 required bool last_block = 3; 6 required fixed32 block_index = 4; 7 .....//其他的字段为 XXXResponse.. 8 }

5. 最后我会定义一个大消息,把Command、Request、Response、Indication全部封装在一起,让后在通信的时候都动大消息开始编解码。大消息看起来想下面这样。。

01 message Message 02 {

03 required MSG type = 1;

04 required fixed32 sequence = 2; 05

06 optional Request request = 3; 07 optional Response response = 4; 08 optional Command command = 5; 09 optional Indication indication = 6; 10 }

6. 发送数据和接收数据。

用于UDP的时候比较简单,因为每个数据包就是一个独立的Message消息,可以直接解码,或者编码后直接发送。

但是如果是使用于TCP的时候,由于涉及到粘包、拆包等处理,而且Message消息里面也没有包含长度相关的字段(不好处理),因此把Message编码后的消息嵌入另外一个二进制消息中。

使用4字节消息长度+Message(二进制数据)+(2字节CRC校验(可选))

其中4字节的内容,只包含Message的长度,不包含自身和CRC的长度。如果需要也可以包含,当要记得通信双方必须一致。

6. 消息处理(C++)

编解码后,根据Message.type字段,可以知道要处理的消息,进行分发。不过一般情况下我不喜欢if、switch。所以我比较倾向于使用虚函数来处理。因此一般情况下我会定义一下的处理方法。

01 #pragma once 02

03 #include 04 #include 05 #include 06

07 #include \08


protobuf消息定义原则.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《群论》点群习题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: