1. 程式人生 > 實用技巧 >netty-分隔符和定長解碼器的應用

netty-分隔符和定長解碼器的應用

TCP以位元組流的方式進行資料傳輸,上層應用協議為了對訊息進行區分,往往採用如下4種方式。

  1. 訊息長度固定:累計讀取到固定長度為LENGTH之後就認為讀取到了一個完整的訊息。然後將計數器復位,重新開始讀下一個資料報文。
  2. 回車換行符作為訊息結束符:在文字協議中應用比較廣泛。
  3. 將特殊的分隔符作為訊息的結束標誌,回車換行符就是一種特殊的結束分隔符。
  4. 通過在訊息頭中定義長度欄位來標示訊息的總長度。

netty中針對這四種場景均有對應的解碼器作為解決方案。

DelimiterBasedFrameDecoder應用開發

DelimiterBasedFrameDecoder自動完成以分隔符作為碼流結束標識訊息結束的解碼。

EchoServer收到EchoClient的請求訊息後,將其打印出來,然後將原始訊息返回客戶端。訊息以”$_” 作為分隔符。

如:

//設定連線符/分隔符,換行顯示

ByteBuf buf = Unpooled.copiedBuffer("$_".getBytes());

//DelimiterBasedFrameDecoder:自定義分隔符

sc.pipeline().addLast(newDelimiterBasedFrameDecoder(1024, buf));

FixedLengthFrameDecoder用於對固定長度的訊息進行自動解碼(定長訊息):及傳送的訊息需要一定的長度,當長度不夠時, 剩下的訊息將會被丟棄,只能通過補空格來防止被丟棄

如實列:

設定每次傳送長度為5個字元 pipeline.addLast(new FixedLengthFrameDecoder(5));