天天看點

執行個體:Netty 處理 TCP協定資料分包問題

一、netty解決tcp協定資料分包問題思路

我們知道通過tcp協定發送接收資料時,如果資料過大,接收到的資料會是分包的,比如:

          +-----+-----+-----+

         發送資料是: | abc | def | ghi |

                            +-----+-----+-----+

         而我們想接受到的資料是: | abcdefghi |

該如何處理這種情況呢?netty提供了一個專門處理tcp協定資料的handler:lengthfieldbasedframedecoder ,它的原理是伺服器端和用戶端約定一個協定格式:資料包=協定長度+協定體

      --------------------------------資料包------------------------------

 | 協定長度部分(接收資料長度) | 協定體部分(要接收的資料)|

舉個例子,假如我們的tcp用戶端發送了10mb位元組的資料,如何讓netty伺服器一次就接收到這10mb資料呢?那就需要用戶端告訴服務端我發送的資料大小是多少,即在發送的資料中加入一個“資料包長度”即可,上面提到的handler就是用來和用戶端約定這個協定格式的,它有幾個參數,下面我介紹一下它的參數意義:

     int maxframelength:定義接收資料包的最大長度,如果發送的資料包超過此值,則抛出異常;

     int lengthfieldoffset:長度屬性部分的偏移值,0表示長度屬性位于資料標頭部;

     int lengthfieldlength:長度屬性的位元組長度,如果設定為4,就是我們用4個位元組存放資料包的長度;

     int lengthadjustment:協定體長度調節值,修正資訊長度,如果設定為4,那麼解碼時再向後推4個位元組;

     int initialbytestostrip:跳過位元組數,如我們想跳過長度屬性部分。

二、執行個體-用戶端發送10mb位元組的資料,netty服務端一次接收到全部10mb資料

用戶端:定義一個消息體,用頭部四個位元組存放資料包長度

netty服務端:定義一個lengthfieldbasedframedecoder(1024*1024*1024, 0, 4,0,4)),最大資料量是1gb,長度屬性位于資料標頭部,占4個位元組,協定體調節值為0,跳過頭部協定長度四個位元組

三、總結:用戶端和服務端定義消息格式必須一緻

繼續閱讀