阅读 73

protobuffer序列化,avro和protobuffer

了解Protobufprotobuf是一种平台无关、语言无关、可扩展、轻量级、高效的序列化数据结构协议,网络通信和http://

Protobuf [由于源工作站可能具有防盗链机制,因此建议保存并直接上传图像(img-VAUA04OZ-1603160278192 ) ]

使用方法也比较简单:

定义消息文件中的. proto

使用protobuf的编译器编译消息文件

使用编译了相应语言的类文件对消息进行序列化和反序列化

首先定义简单的消息:

消息人员{ int 32id=1; //24字符串名称=2; //wujingchao string email=3; //wujingchao92@gmail.com}实际二进制消息为:

0818120 a 77756 a 696 e 67636861 f1a 1677756 a 696 e 67676861 f 39324067 d 6169 C2 e 636 f6d

实际上,Protobuffer通过将数据转换为二进制数据,大大提高了传输效率!

使用步骤:

首先,在Java的对等目录下创建一个名为proto的文件夹,以存储proto文件。 创建proto文件后,编译模块将根据proto文件的内容生成Java文件。

[导出外链图像失败。 源站可能有防盗链机制。 我们建议您保存图片并直接上传。 (img-byuMT92w-1603160278195 ) ) d :/images4note/2608075-1 e 8f 6b 397107 fd56.png ) ]

让我们看看名为Test.proto的文件的内容:

protobuf语法版本syntax='proto2'; //包名称option Java _ package=' com.LHC.proto buf '; //源文件类名称option Java _ outer _ class name=' address book protos '; //classpersonmessageperson {//required必须满足required string name=1; //int32与java的int required int32 id=2相对应; //optional为空的optional string email=3; enum PhoneType { MOBILE=0; 主页=1; 工作=2; } message phone number { requiredstringnumber=1; optionalphonetypetype=2[ default=home ]; } //repeated重复的(集合) repeated PhoneNumber phones=4; } message address book { repeatedpersonpeople=1; } proto buf APP应用------网络传输http传输通常在APP应用层使用http协议,http的本质是连接和断开套接字请求。 传输数据时,只需将protobuf对象转换为byte[]进行传输即可

自定义TCP通信协议自定义TCP通信协议时,会遇到数据包粘贴和分包的问题

分包:

要发送的数据大于TCP缓冲区的可用空间

要发送的数据大于MSS (最大消息长度)

[导出外链图像失败。 源站可能有防盗链机制。 我们建议您保存图片并直接上传。 (img-r7m6au50-1603160278198 ) ) d :/images4note/2608075-120 DFD 45169 EB 074.webp ) ]

粘合包:

如果发送的数据小于TCP缓冲区,则一起发送和接收多次写入缓冲区的数据的APP应用层无法立即读取缓冲区数据,有两种方法可以自定义通信协议

定义包标题[外部链接图像导出失败。 源工作站可能有防盗链机制。 我们建议您保存并直接上传图片。 (img-wWbO0e5H-1603160278201 ) ) d :/images4note/2608075-43774 EFE 82958 aa-155368

在包之间设置边界[导出外部链图像失败。 源工作站可能有防盗链机制。 我们建议您保存图片并直接上传。 (img-8坚固等大碗84Xgy-1603160278204 ) ) d :/images4note/2608075-4a e26 be 105 ab 8167.weei

参考JT808协议------交通部808协议(电信),也可以用同样的方法定义通信协议

细节:枚举enum类型: 1、一个proto文件不支持,多个枚举定义了相同的枚举枚举名称。 enum Enum1 { IDLE=0; RUNNING=1; }enum Enum2 { IDLE=5; RUNNING=6; }如果编译失败,将报告错误!

2、枚举的第一个常量值必须为0 eg:

enumballtypeenum { ball _ type _ unspecified=0; BASKETBALL=1; FOOTBALL=2; (报告错误!==

2、枚举的第一个常量值必须为0 eg:

enumballtypeenum { ball _ type _ unspecified=0; BASKETBALL=1; FOOTBALL=2; }


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐