netty codec部分剖析

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

相關文章
相關標籤/搜索