ProtoBuffer笔记
Protobuf学习
Protobuf是什么
Protobuf是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。
为什么要使用Protobuf
使用方法也比较简单:
定义用于消息文件.proto
使用protobuf的编译器编译消息文件
使用编译好对应语言的类文件进行消息的序列化与反序列化
先来定义一个简单的消息:
1
2
3
4
5message Person {
int32 id = 1;//24
string name = 2;//wujingchao
string email = 3;//wujingchao92@gmail.com
}实际的二进制消息为:
08 18 12 0a 77 75 6a 69 6e 67 63 68 61 6f 1a 16 77 75 6a 69 6e 67 63 68 61 6f 39 32 40 67 6d 61 69 6c 2e 63 6f 6d
其实Protobuffer就是把数据转换成2进制的数据,这样传输效率会大大提高!!
使用步骤:
先在Java的同级目录下新建一个名为proto的文件夹专门用于存放proto文件,编写proto文件后编译模块会根据proto文件内容生成java文件。
来看一下名为Test.proto的文件内容:
1 |
|
Protobuf应用——网络传输
http传输
通常在应用层我们使用的都是Http协议,Http的本质是一次socket请求的连接与断开。传输数据时将protobuf对象转换为byte[]传输即可
自定义TCP通信协议
当我们自定义TCP通信协议的时候,将面临粘包与分包的问题
分包:
- 要发送的数据大于TCP缓冲剩余空间
- 待发送数据大于MSS(最大报文长度)
粘包:
- 要发送的数据小于TCP缓冲区,将多次写入缓冲区的数据一起发送
- 接收端的应用层没有及时读取缓冲区的数据
自定义通信协议的两种方式
- 定义数据包包头
- 在数据包之间设置边界
大家可以参考 JT808协议 ——交通部808协议(车联网),也是采用类似的方式定义通信协议
小细节:
枚举enum类型:
1、不支持一个proto文件中,多个枚举中定义相同的枚举常量名。
1 |
|
==编译不通过,会报错!!!==
2、枚举第一个常量的值必须是0
eg:
1 |
|
ProtoBuffer笔记
https://github.com/yangxiangnanwill/yangxiangnanwill.github.io/2024/01/03/好好码代码吖/JAVA/其他/ProtoBuffer笔记/