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