首页 > 代码库 > netty codec部分剖析

netty codec部分剖析

针对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的对象序列化原则进行的,略。