录[-] ? 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
07 #include \08
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库protobuf消息定义原则在线全文阅读。
相关推荐: