Protobuf消息设计原则(值得借鉴)
2015-04-16 16:43
113 查看
目录[-]
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抓包
?
网络通信涉及到消息的定义,不管是使用二进制模式、xml、json等格式。消息都可以大体的分为 命令消息、请求消息、应答消息和指示消息4大消息类型。一般情况下每个消息还还有包含一个序列号和一个能够唯一区分类型类型的消息编号,编号可以使用字符串、整数或者枚举等。
我会为每个系统都定义一个MSG枚举。包含系统用到的所有消息的枚举编号
?
?
也就是我会有下面4个protobuf message:
?
?
?
用于UDP的时候比较简单,因为每个数据包就是一个独立的Message消息,可以直接解码,或者编码后直接发送。
但是如果是使用于TCP的时候,由于涉及到粘包、拆包等处理,而且Message消息里面也没有包含长度相关的字段(不好处理),因此把Message编码后的消息嵌入另外一个二进制消息中。
使用4字节消息长度+Message(二进制数据)+(2字节CRC校验(可选))
其中4字节的内容,只包含Message的长度,不包含自身和CRC的长度。如果需要也可以包含,当要记得通信双方必须一致。
编解码后,根据Message.type字段,可以知道要处理的消息,进行分发。不过一般情况下我不喜欢if、switch。所以我比较倾向于使用虚函数来处理。因此一般情况下我会定义一下的处理方法。
?
protobuf是二进制的消息,wireshark抓包是无法直接分析的。不过google上面已经有了插件。 不过插件只支持UDP.本人在google上面的protobuf-wireshark的基础上修改了支持TCP的抓包解析,前提是顶层Message只有一个,而且封装在4个字节的长度后面。插件下载地址http://download.csdn.net/detail/chenxiaohong3905/5271945(wireshark
1.8.6版本). CSDN没分数的可以call me,留下你的邮箱。
接口主要遵循 Request、Response、Notification(Indication),Command(本文未出现)四大消息分类,并且使用Message顶层消息把Request、Response,Notification等包含起来;并定义一个MSG枚举值,用于表示具体的消息值(在google protobuf RPC过程中,其实 每个service方法就是一个Request和Response的应答对,只不过其消息值的编码是RPC自动分配的)
?
本文摘自:http://my.oschina.net/cxh3905/blog/159122
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抓包
?
网络通信涉及到消息的定义,不管是使用二进制模式、xml、json等格式。消息都可以大体的分为 命令消息、请求消息、应答消息和指示消息4大消息类型。一般情况下每个消息还还有包含一个序列号和一个能够唯一区分类型类型的消息编号,编号可以使用字符串、整数或者枚举等。
1. 使用 protobuf 的enum定于消息的编号,也就是消息的类型。
我会为每个系统都定义一个MSG枚举。包含系统用到的所有消息的枚举编号?
2. 会为每个具有消息体的消息定义一个对应的protobuf message。例如Login_Request会有一个对应LoginRequest消息。
?
3. 会为每个消息大类定义一个消息,例如命令消息全部包含在message Command中,请求消息全部包含在Request消息中,应答消息全部包含在Response消息中,指示消息全部包含在Indication消息中。
也就是我会有下面4个protobuf message:?
4. 对于应答消息,并非总是成功的,因此在应答消息中还会包含另外2个字段。一个用于描述应答是否成功,一个用于描述失败时的字符串信息。 对于有多个应答的消息来说,可能会包含是否为最后一个应答消息的标识。应答的序号(类似与网络数据包被分包以后,协议要合并时,需要知道分片在包中的具体位置)。因此Response看起来想这样:
?
5. 最后我会定义一个大消息,把Command、Request、Response、Indication全部封装在一起,让后在通信的时候都动大消息开始编解码。大消息看起来想下面这样。。
?
6. 发送数据和接收数据。
用于UDP的时候比较简单,因为每个数据包就是一个独立的Message消息,可以直接解码,或者编码后直接发送。但是如果是使用于TCP的时候,由于涉及到粘包、拆包等处理,而且Message消息里面也没有包含长度相关的字段(不好处理),因此把Message编码后的消息嵌入另外一个二进制消息中。
使用4字节消息长度+Message(二进制数据)+(2字节CRC校验(可选))
其中4字节的内容,只包含Message的长度,不包含自身和CRC的长度。如果需要也可以包含,当要记得通信双方必须一致。
6. 消息处理(C++)
编解码后,根据Message.type字段,可以知道要处理的消息,进行分发。不过一般情况下我不喜欢if、switch。所以我比较倾向于使用虚函数来处理。因此一般情况下我会定义一下的处理方法。?
7. wireshark抓包
protobuf是二进制的消息,wireshark抓包是无法直接分析的。不过google上面已经有了插件。 不过插件只支持UDP.本人在google上面的protobuf-wireshark的基础上修改了支持TCP的抓包解析,前提是顶层Message只有一个,而且封装在4个字节的长度后面。插件下载地址http://download.csdn.net/detail/chenxiaohong3905/5271945(wireshark1.8.6版本). CSDN没分数的可以call me,留下你的邮箱。
8. 附件:聊天服务器(Chat)定义google protobuf的协议接口文件
接口主要遵循 Request、Response、Notification(Indication),Command(本文未出现)四大消息分类,并且使用Message顶层消息把Request、Response,Notification等包含起来;并定义一个MSG枚举值,用于表示具体的消息值(在google protobuf RPC过程中,其实 每个service方法就是一个Request和Response的应答对,只不过其消息值的编码是RPC自动分配的)?
相关文章推荐
- Protobuf消息设计原则(值得借鉴)
- 我的Protobuf消息设计原则
- 我的Protobuf消息设计原则
- 我的Protobuf消息设计原则
- 我的Protobuf消息设计原则(续)--实践
- 基于netty的项目中使用protobuf,巧妙定义proto完成不同消息的编码和解码处理 .
- 使用protobuf和socket实现服务器间消息的传递
- 一种值得借鉴的设计思路
- Unity3D使用TCP/IP协议,传递protocol buffer消息protobuf-net
- protobuf定义低带宽的移动消息
- 一种自动反射消息类型的 Google Protobuf 网络传输方案
- 运用google-protobuf的IM消息应用开发(前端篇)
- Unity3D传递ProtoBuf-net消息测试
- RabbitMQ消息队列的小伙伴: ProtoBuf(Google Protocol Buffer)
- 一种自动反射消息类型的 Google Protobuf 网络传输方案
- protobuf 中的嵌套消息的使用
- 在 muduo 中实现 protobuf 编解码器与消息分发器
- 基于netty的项目中使用protobuf,巧妙定义proto完成不同消息的编码和解码处理
- 值得注意的单片机控制板的设计原则
- 一种自动反射消息类型的 Google Protobuf 网络传输方案