过长内容分成了多次发送 问题 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 plaincopy?
?
使用LengthFieldBasedFrameDecoder作為decoder實現,LengthFieldBasedFrameDecoder構造函數,第一個參數為信息最大長度,超過這個長度回報異常,第二參數為長度屬性的起始(偏移)位,我們的協議中長度是0到第3個字節,所以這里寫0,第三個參數為“長度屬性”的長度,我們是4個字節,所以寫4,第四個參數為長度調節值,在總長被定義為包含包頭長度時,修正信息長度,第五個參數為跳過的字節數,根據需要我們跳過前4個字節,以便接收端直接接受到不含“長度屬性”的內容。
?
至此,接收端會按照decoder指定的長度接收完整后才會調用handler繼續處理信息。
轉載于:https://www.cnblogs.com/gehonglin/p/4174459.html
總結
以上是生活随笔為你收集整理的过长内容分成了多次发送 问题 LengthFieldBasedFrameDecoder使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linq GroupJoin 使用
- 下一篇: 多线程下HttpContext.Curr