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; }