在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之前,例如:
- bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
- public ChannelPipeline getPipeline() throws Exception {
- ChannelPipeline pipeline = new DefaultChannelPipeline();
- pipeline.addFirst("decoder", new LengthFieldBasedFrameDecoder(100000000,0,4,0,4));
- pipeline.addLast("handler", new XXX(config));
- return pipeline;
- }
- });
使用LengthFieldBasedFrameDecoder作為decoder實現,LengthFieldBasedFrameDecoder構造函數,第一個參數為信息最大長度,超過這個長度回報異常,第二參數為長度屬性的起始(偏移)位,我們的協議中長度是0到第3個字節,所以這里寫0,第三個參數為“長度屬性”的長度,我們是4個字節,所以寫4,第四個參數為長度調節值,在總長被定義為包含包頭長度時,修正信息長度,第五個參數為跳過的字節數,根據需要我們跳過前4個字節,以便接收端直接接受到不含“長度屬性”的內容。
至此,接收端會按照decoder指定的長度接收完整后才會調用handler繼續處理信息。