針對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