netty codec部分剖析

本文深入剖析了Netty 3.2版本的编解码机制,探讨了为什么需要encoder和decoder,以及它们在网络传输中的作用。Netty基于nio,通过encoder将对象转化为channelBuffer,decoder再将接收到的channelBuffer还原为对象。对象Encoder和Decoder的实现基于Java对象序列化。
摘要由CSDN通过智能技术生成

针对netty 3.2进行剖析


今天用到了netty的encoder和decoder(coder其本质还是handler),特剖析一个netty提供的coder,从而选择或者实现我自己的coder。

1. 为什么要进行encoder和decoder?

众所周知,网络传输的是字节流,而我们面向对象编程操作都是对象或者基本数据类型,因此在传输前需要将对象或基本类型转换为字节;而在接收到

后又要将字节转换为对象或基本类型。同时,对于netty是基于nio的框架,而nio相对应oio的一个显著特点就是传输是基于缓冲的(buffer),故在netty中传输前:对象-->channelBuffer,接收后:channelBuffer-->对象。netty的所有coder实现都是基于这个准则进行的。

2. coder包结构:

可以看出netty已经实现了好多中不同类型的coder,用来支持不同的类型或协议。

3. 下面对org.jboss.netty.handler.codec.serialization包中的ObjectEncoder和ObjectDecoder进行剖析:

可以看到ObjectEncoder类的encoder()方法:

  @Override
79      protected Object encode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception {
80          ChannelBufferOutputStream bout =
81              new ChannelBufferOutputStream(dynamicBuffer(
82                      estimatedLength, ctx.getChannel().getConfig().getBufferFactory()));
83          bout.write(LENGTH_PLACEHOLDER);
84          ObjectOutputStream oout = new CompactObjectOutputStream(bout);
85          oout.writeObject(msg);
86          oout.flush();
87          oout.close();
88  
89          ChannelBuffer encoded = bout.buffer();
90          encoded.setInt(0, encoded.writerIndex() - 4);
91          return encoded;
92      }
跟进去看CompactObjectOutputStram类的writeObject()方法,其实就是使用了java自身提供的序列化机制ObjectOutputStream类的writerObject()方法。

而ObjectDecoder类的decode()方法,也是基于java的对象序列化原则进行的,略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值