netty-分隔符和定長解碼器的應用
阿新 • • 發佈:2020-09-21
TCP以位元組流的方式進行資料傳輸,上層應用協議為了對訊息進行區分,往往採用如下4種方式。
- 訊息長度固定:累計讀取到固定長度為LENGTH之後就認為讀取到了一個完整的訊息。然後將計數器復位,重新開始讀下一個資料報文。
- 回車換行符作為訊息結束符:在文字協議中應用比較廣泛。
- 將特殊的分隔符作為訊息的結束標誌,回車換行符就是一種特殊的結束分隔符。
- 通過在訊息頭中定義長度欄位來標示訊息的總長度。
netty中針對這四種場景均有對應的解碼器作為解決方案。
DelimiterBasedFrameDecoder應用開發
DelimiterBasedFrameDecoder自動完成以分隔符作為碼流結束標識訊息結束的解碼。
EchoServer收到EchoClient的請求訊息後,將其打印出來,然後將原始訊息返回客戶端。訊息以”$_” 作為分隔符。
如:
//設定連線符/分隔符,換行顯示
ByteBuf buf = Unpooled.copiedBuffer(
"$_"
.getBytes());
//DelimiterBasedFrameDecoder:自定義分隔符
sc.pipeline().addLast(
new
DelimiterBasedFrameDecoder(1024, buf));
FixedLengthFrameDecoder用於對固定長度的訊息進行自動解碼(定長訊息):及傳送的訊息需要一定的長度,當長度不夠時, 剩下的訊息將會被丟棄,只能通過補空格來防止被丟棄
如實列:
設定每次傳送長度為5個字元 pipeline.addLast(new FixedLengthFrameDecoder(5));