netty中LengthFieldBasedFrameDecoder的使用

在org.jboss.netty.handler.codec.frame包中,有LengthFieldBasedFrameDecoder類用來解析帶有長度屬性的包,只要咱們在傳輸協議中加入包的總長度就好了(也許有更好的方法)java

 

具體方法:bootstrap

1.可在數據包前加4個字節表示包的總長度,例如:函數

 

/** 
* 傳輸協議
* |------------------------------------------
* |總長度4byte |pkey長度4byte      |
* |------------------------------------------
* | value 4byte|name 4byte|zip  1 |
* |------------------------------------------
* |skey值      8byte(long型時間,固定) |
* |------------------------------------------------
* |  包體內容                                             |
* |                    
* |------------------------------------------------spa

在經過netty傳輸數據以前,執行.net

 

2.在接受的ChannelPipeline中加入decoder,加在handler以前,例如:netty

 

 

[java]  view plain copy
 
  1. bootstrap.setPipelineFactory(new ChannelPipelineFactory() {  
  2.            public ChannelPipeline getPipeline() throws Exception {  
  3.             ChannelPipeline pipeline = new DefaultChannelPipeline();  
  4.             pipeline.addFirst("decoder", new LengthFieldBasedFrameDecoder(100000000,0,4,0,4));  
  5.             pipeline.addLast("handler", new XXX(config));  
  6.             return pipeline;  
  7.            }  
  8.        });  

 

 

使用LengthFieldBasedFrameDecoder做爲decoder實現,LengthFieldBasedFrameDecoder構造函數,第一個參數爲信息最大長度,超過這個長度回報異常,第二參數爲長度屬性的起始(偏移)位,咱們的協議中長度是0到第3個字節,因此這裏寫0,第三個參數爲「長度屬性」的長度,咱們是4個字節,因此寫4,第四個參數爲長度調節值,在總長被定義爲包含包頭長度時,修正信息長度,第五個參數爲跳過的字節數,根據須要咱們跳過前4個字節,以便接收端直接接受到不含「長度屬性」的內容。code

 

至此,接收端會按照decoder指定的長度接收完整後纔會調用handler繼續處理信息。blog

相關文章
相關標籤/搜索