Protobuf
netty自带的编码/解码器
数据再网络中传输都是二进制字节码数据、发送数据需要编码、接收数据需要解码
codec
的组成部分由两个:decoder
和encoder
缺点:
1、无法跨语言
2、底层采用java序列化技术、序列化后体积大(二进制编码的五倍多)、性能低
Protobuf介绍
1、高效的结构化数据存储格式,可用于结构化数据串行化(序列化)、适合做数据存储或者==RPC【远程过程调用 remote procedure call】数据交换格式==
2、支持跨平台、跨语言
3、高性能、高可靠性
4、将类的定义使用.proto
文件进行描述
5、通过protoc.exe
对.proto
进行编译城java文件
使用案例
创建一个 .proto 文件
syntax="proto3";
option optimize_for=SPEED;//加快解析
option java_package="com.cyurs.netty.codec2"; //指定生成到那个包下
option java_outer_classname="MyDataInfo"; //指定外部类名称
//protobuf 可以使用message 管理其他message
message MyMessage{
//定义一个枚举
enum DataType{
StudentType=0; //在proto3 要求enum编号从0开始
WorkerType=1;
}
DataType data_type=1; //用data_type标识传的是哪一个枚举类型
//oneof表示每次枚举类型最多只能出现定义的message(Student、Worker)的其中一个
oneof dataBody{
Student student =2;
Worker worker =3;
}
}
message Student{
int32 id=1; //Student类的属性
string name =2;
}
message Worker{
string name=1; //Student类的属性
int32 age =2;
}
使用protoc.exe生成.java文件
配置客户端Handler
public class NettyClientHandler extends ChannelInboundHandlerAdapter {
/**
* 当通道就绪就会触发
* @param ctx
* @throws Exception
*/
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
//随机发送student或者worker对象
int random = new Random().nextInt(2);
MyDataInfo.MyMessage myMessage = null;
if (random == 0) {
myMessage = MyDataInfo.MyMessage.newBuilder().setDataType(MyDataInfo.MyMessage.DataType.StudentType)
.setStudent(MyDataInfo.Student.newBuilder(