netty中LengthFieldBasedFrameDecoder的使用


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

 

具體方法:

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

 

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

在通過netty傳輸數據之前,執行

 

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

 

 

[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個字節,以便接收端直接接受到不含“長度屬性”的內容。

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM