针对netty 3.2进行剖析html
今天用到了netty的encoder和decoder(coder其本质仍是handler),特剖析一个netty提供的coder,从而选择或者实现我本身的coder。java
1. 为何要进行encoder和decoder?编程
众所周知,网络传输的是字节流,而咱们面向对象编程操做都是对象或者基本数据类型,所以在传输前须要将对象或基本类型转换为字节;而在接收到网络
后又要将字节转换为对象或基本类型。同时,对于netty是基于nio的框架,而nio相对应oio的一个显著特色就是传输是基于缓冲的(buffer),故在netty中传输前:对象-->channelBuffer,接收后:channelBuffer-->对象。netty的全部coder实现都是基于这个准则进行的。框架
2. coder包结构:ide
能够看出netty已经实现了好多中不一样类型的coder,用来支持不一样的类型或协议。spa
3. 下面对org.jboss.netty.handler.codec.serialization包中的ObjectEncoder和ObjectDecoder进行剖析:.net
能够看到ObjectEncoder类的encoder()方法:netty
@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的对象序列化原则进行的,略。code