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