摘要:以流的方式進行數據傳輸上層的應用協議為了對消息進行區分往往采用如下中方式消息長度固定累計讀取到長度總和為定長的報文后就認為讀到了一個完整的消息將計數器置位重新開始讀取下一個數據報將回車換行符作為消息結束符例如協議這種方式在文本協議中應用比較
TCP 以流的方式進行數據傳輸, 上層的應用協議為了對消息進行區分, 往往采用如下 4 中方式.
消息長度固定, 累計讀取到長度總和為定長 LEN 的報文后, 就認為讀到了一個完整的消息; 將計數器置位, 重新開始讀取下一個數據報;
將回車換行符作為消息結束符, 例如 FTP 協議, 這種方式在文本協議中應用比較廣泛.
將特殊的分隔符最為消息的結束標志, 回車換行符就是一種特殊的結束分隔符;
通過在消息頭中定義長度字段來標識消息的總長度.
Netty 對上面 4 種應用做了統一的抽象, 提供了 4 種解碼器來解決對應用的問題.
之前我寫了 LineBasedFrameDecoder 解碼器的使用, 今天開始學習如何使用 DelimiterBasedFrameDecoder 和 FixedLengthFrameDecoder.
DelimiterBasedFrameDecoder 應用開發通過對 DelimiterBasedFrameDecoder 的使用, 我們可以自動完成以分隔符作為碼流結束標識的消息的解碼.
還是修改 initChannel 方法
ByteBuf delimiter = Unpooled.copiedBuffer("$_".getBytes()); ch.pipeline().addLast(new DelimiterBasedFrameDecoder(1024, delimiter)); ch.pipeline().addLast(new StringDecoder()); ch.pipeline().addLast(new TimeServerHandler());
我們使用 $_ 作為分隔符, 創建 DelimiterBasedFrameDecoder 對象, 將其加入到 ChannelPipeline 中. DelimiterBasedFrameDecoder 有多個構造方法, 這里我們傳遞兩個參數: 第一個 1024 表示單條消息的最大長度, 當達到該長度后仍然沒有檢查到分隔符, 將拋出 TooLongFrameException 異常, 防止由于異常碼流缺失分隔符導致的內存溢出, 這是 Netty 解碼器的可靠性保護; 第二個參數就是分隔符緩沖對象.
由于我們設置 DelimiterBasedFrameDecoder 過濾掉了分隔符, 所以返回給客戶端時需要在請求消息尾部拼接分隔符 $_.FixedLengthFrameDecoder 應用開發
FixedLengthFrameDecoder 是固定長度解碼器, 它能夠按照指定的長度對消息進行自動解碼.
ch.pipeline().addLast(new FixedLengthFrameDecoder(10)); ch.pipeline().addLast(new StringDecoder()); ch.pipeline().addLast(new TimeServerHandler());
利用 FixedLengthFrameDecoder 解碼器, 無論一次接收到多少數據報, 他都會按照構造函數中設置的固定長度進行解碼, 如果是半包消息, FixedLengthFrameDecoder 會緩存半包消息并等待下個包到達后進行拼包, 直到讀取到一個完整的包.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72767.html
摘要:接收方只需要等待,直到讀到確定數量的字節,然后處理即可。而這個字節流的前個字節用于表示對象的長度,接下來的字節就是傳輸的對象的字節流,最后不夠最大長度的用任意字節進行填充即可。 什么是tcp半包粘包?簡單來講就是接收到的tcp包并不一定是一個完整的包。它可能是1個包的一部分,也可能是多個完整包加上1個包的一部分。為什么?因為tcp的定義是面向字節流的傳輸協議,所以操作系統實現這個協議的...
摘要:其他編碼的可以參考,,的選擇不考慮隨機訪問,,查找第個字符時間復雜度隨機訪問,只用之內的字符,,時間復雜度隨機訪問,超過了,詳解編碼 1.字符集vs字符編碼,編碼&解碼 Character----->code point----->bytes 前兩者字符集的關系,可以統稱為codepoint;從codepoint到在計算機上的存儲形式,稱為編碼,反過來稱為解碼; 字符集:單個符號(ch...
摘要:是一個面向字節流的協議,它是性質是流式的,所以它并沒有分段。可基于分隔符解決。編解碼的主要目的就是為了可以編碼成字節流用于在網絡中傳輸持久化存儲。 showImg(https://segmentfault.com/img/remote/1460000015895049); 前言 記得前段時間我們生產上的一個網關出現了故障。 這個網關邏輯非常簡單,就是接收客戶端的請求然后解析報文最后發送...
閱讀 2201·2021-11-25 09:43
閱讀 1170·2021-11-23 09:51
閱讀 3503·2021-11-23 09:51
閱讀 3632·2021-11-22 09:34
閱讀 1556·2021-10-09 09:43
閱讀 2125·2019-08-30 15:53
閱讀 3166·2019-08-30 14:07
閱讀 574·2019-08-28 18:14