Netty学习篇⑤--编、解码源码分析
2019-11-20 16:22
前言
学习Netty也有一段时间了,Netty作为一个高性能的异步框架,很多RPC框架也运用到了Netty中的知识,在rpc框架中丰富的数据协议及编解码可以让使用者更加青睐;
Netty支持丰富的编解码框架,其本身内部提供的编解码也可以应对各种业务场景;
今天主要就是学习下Netty中提供的编、解码类,之前只是简单的使用了下Netty提供的解码类,今天更加深入的研究下Netty中编、解码的源码及部分使用。
编、解码的概念
编码(Encoder)
编码就是将我们发送的数据编码成字节数组方便在网络中进行传输,类似Java中的序列化,将对象序列化成字节传输
解码(Decoder)
解码和编码相反,将传输过来的字节数组转化为各种对象来进行展示等,类似Java中的反序列化
如:
// 将字节数组转化为字符串
new String(byte bytes[], Charset charset)
编、解码超类
ByteToMessageDecoder: 解码超类,将字节转换成消息
解码解码一般用于将获取到的消息解码成系统可识别且自己需要的数据结构;因此ByteToMessageDecoder需要继承ChannelInboundHandlerAdapter入站适配器来获取到入站的数据,在handler使用之前通过channelRead获取入站数据进行一波解码;
ByteToMessageDecoder类图
avatar
源码分析
通过channelRead获取入站数据,将数据缓存至cumulation数据缓冲区,最后在传给decode进行解码,在read完成之后清空缓存的数据
1. 获取入站数据
/**
* 通过重写channelRead方法来获取入站数据
*/
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// 检测是否是byteBuf对象格式数据
if (msg instanceof ByteBuf) {
// 实例化字节解码成功输出集合 即List