Netty-编码和解码
编码和解码的基本介绍
- 编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码
- codec(编解码器) 的组成部分有两个:decoder(解码器)和 encoder(编码器)。encoder 负责把业务数据转换成字节码数据,decoder 负责把字节码数据转换成业务数据
Netty 本身的编码解码的机制和问题分析
- Netty 自身提供了一些 codec(编解码器)
- Netty 提供的编码器
• StringEncoder,对字符串数据进行编码
• ObjectEncoder,对 Java 对象进行编码
• … - Netty 提供的解码器
• StringDecoder, 对字符串数据进行解码
• ObjectDecoder,对 Java 对象进行解码
• … 4) Netty 本身自带的 ObjectDecoder 和 ObjectEncoder 可以用来实现 POJO 对象或各种业务对象的编码和解码,底层使用的仍是 Java 序列化技术 , 而Java 序列化技术本身效率就不高,存在如下问题
• 无法跨语言
• 序列化后的体积太大,是二进制编码的 5 倍多。
• 序列化性能太
Protobuf基本介绍和使用示意图
- Protobuf 是 Google 发布的开源项目,全称 Google Protocol Buffers,是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC[远程过程调用 remote procedure call ] 数据交换格式 。目前很多公司 http+json tcp+protobuf
- 参考文档 : https://developers.google.com/protocol-buffers/docs/proto 语言指南
- Protobuf 是以 message 的方式来管理数据的.
- 支持跨平台、跨语言,即[客户端和服务器端可以是同的语言编写的] (支持目前绝大多数语言,例如 C++、C/#、Java、python 等)
- 高性能,高可靠性
- 使用 protobuf 编译器能自动生成代码,Protobuf 是将类的定义使用.proto 文件进行描述。说明,在idea 中编写 .proto 文件时,会自动提示是否下载 .ptotot 编写插件. 可以让语法高亮。
- 然后通过 protoc.exe 编译器根据.proto 自动生成.java 文件
- protobuf 使用示意图
使用
pom.xml
1 | <properties> |
安装插件
Protobuf
发送单一对象
Student.proto文件
1 | syntax = "proto3"; |
利用插件转换
将target中编译后的class文件拿过来
客户端加入到pipeline
1 | ch.pipeline().addLast("encoder",new ProtobufEncoder());//在pieline中加入ProtoBufEncoder |
客户端发送一个对象
1 | //发送一个student 对象 |
服务端加入到piepline
1 | ch.pipeline().addLast("decoder",new ProtobufDecoder(StudentPOJO.Student.getDefaultInstance()));//加入ProtoBufDecoder |
服务端监听
1 | @Override |
发送两个对象
protobuf文件
1 | syntax = "proto3"; |
将target中编译后的class文件拿过来
客户端加入到pipeline
1 | ch.pipeline().addLast("encoder",new ProtobufEncoder());//在pieline中加入ProtoBufEncoder |
客户端发送一个对象
1 | @Override |
服务端加入到piepline
1 | ch.pipeline().addLast("decoder",new ProtobufDecoder(MyDataInfo.MyMessage.getDefaultInstance()));//加入ProtoBufDecoder |
服务端监听
1 | @Override |
作者声明
1 | 如有问题,欢迎指正! |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 jhj-coding!
评论