Netty4.x中文教程系列(五)編解碼器Codec


Netty4.x中文教程系列(五)編解碼器Codec

    上一篇文章詳細解釋了ChannelHandler的相關構架設計,版本和設計邏輯變更等等。

    這篇文章主要在於講述Handler里面的Codec,也就是相關的編解碼器。原本想把編解碼器寫在上一篇文章里面的。后來想想Netty里面的編解碼器太多了。想要一次寫完比較困難。於是重新開了一篇文章來專門寫這個。

1.     Hello World !實例中的使用

  在這里先講一下我們第一篇文章里面的實例使用到編解碼器。

1.1 DelimiterBasedFrameDecoder解碼器

  DelimiterBasedFrameDecoder 顧名思義我們可以理解為基於分隔符的幀解碼器。參數有兩個,一個是最大幀長度,另外一個是定義分隔符。

在Delimiters中提供給我們兩種分隔符。一種是“0x00-NUL”分隔符。另外一種就是實例中使用的“\r\n”或“\n”分隔符。

 

        

    在構造函數中我們可以看出,當分隔符是“\n”的時候,框架默認解碼器為基於行的幀解碼器(LineBasedFrameDecoder)。否則按照可讀取比特長度進行幀解碼。

1.2 StringDecoder 字符串解碼器 和 編碼器

  解碼器:將比特流轉換為默認編碼的字符串。默認編碼為UTF-8。當然開發者可以通過設置字符編碼參數來設置字符編碼。編碼器:將字符串轉換為Byte[]

2.     Netty中Handler詳述

  在Netty的類庫的handler目錄可以看出它的基本結構(下圖):

 

圖2.1 handler包結構

  整個包由6個主要部分組成,筆者將由簡入繁,慢慢想讀者解釋每個包的含義和用法。(若有不正確之處,希望大家能給予指點)

         2.1 Logging 日志

 

    用於Netty中的日志輸出。

    2.1.1 loggingHandler

  LoggingHandler 繼承於ChannelDuplexHandler。它的注釋我們可以看出:“是一個使用日志框架記錄全部事件的ChannelHandler,  缺省值是記錄全部DEBUG級別以上的事件”。它的功能是記錄全部事件,包含Inbound和Outbound的,之所以選擇了繼承ChannelDuplexHandler,是由於ChannelDuplexHandler 繼承ChannelInboundHandlerAdapter 實現ChannelOutboundHandler。所以相當於Netty框架內的全部通信相關的事件都會得到處理。

    2.1.2LogLevel

在這里作者定義了5個級別的log。TRACE,DEBUG,INFO,WARN,ERROR。

  2.2 Ssl

 

  用於SSL協議解析和編碼。

    2.2.1          SslHandler

    熟悉了解過Http的朋友應該是知道ssl的。SSL 的英文全稱是 “Secure Sockets Layer” ,中文名為 “ 安全套接層協議層 ” ,它是網景( Netscape )公司提出的基於 WEB 應用的安全協議。 SSL 協議指定了一種在應用程序協議(如 HTTP 、 Telenet 、 NMTP 和 FTP 等)和 TCP/IP 協議之間提供數據安全性分層的機制,它為 TCP/IP 連接提供數據加密、服務器認證、消息完整性以及可選的客戶機認證。現在的相當一部分網站都有SSL加密。而SslHander則是Netty提供的Ssl解碼編碼處理。

    2.2.2          NotSslRecordException 和 SslHandshakeCompletionEvent 拋出異常和處理完成觸發事件。

  2.3 Stream 流

 

  用於文件的的傳輸。將Java里面的File轉換為Stream流,然后進行傳輸。

  2.4 Timeout 空閑檢測

 

         用於Netty框架中空閑超時相關。

IdleState 空閑狀態。Netty中的空閑時間包括,讀空閑,寫空閑和讀寫空閑3種時間。

         顧名思義,讀空閑即一段時間內沒有接受到消息,寫空閑即一段時間內沒有發送消息。讀寫空閑即一段時間內讀寫都空閑。主要是用於檢測空閑狀態。並且特定條件下服務端關閉和釋放一些資源。

  2.5 Traffic 流量統計

 

  用於流量統計。

  Netty提供了一個流量統計抽象類,一個Channel流量統計Handler和一個全局帶寬流量統計Handler。

  2.6 Codec 編解碼器

         這個是目前Netty的重點。也是最核心最復雜的部分。也是筆者認為Netty設計里面最好的一部分。

         用於數據的編解碼。

  編解碼器可以理解為訂立一個規范讓客戶端和服務端能夠理解和識別字節流所包含的意思。其實編碼和解碼就是這么簡單的事情,沒什么復雜的。

 

  看到codec里面的這么一大堆的包類。讀者是不是趕腳着很頭暈? O(∩_∩)O哈哈~。作者設計了非常友好的包邏輯結構。方便我們理解源碼。

即Codec包中的類優先看,下面的子包都是一些Netty開發者們提供的一些實現。

有沒有看到HelloWorld出現的LengthFieldBaseFrameDecoder和FixedLengthFrameDecoder。

 

這里主要講的是Netty中最重要的兩個編解碼器ByteToMessageCodec和MessageToMessageCodec。之所只講着兩個的原因是其他的編解碼器都是繼承於這兩個的。

ByteToMessageCodec:在Netty4.x版本中允許傳遞Java中的對象,所以這個編解碼起的作用就是講Byte流轉換為對象。而MessageToMessageCodec則是將Object轉換為Object。這兩個的區分其實很模糊。可能需要大家親自動手寫過之后才會有比較好的感受。

包base64:繼承MessageToMessageEncoder<ByteBuf>。是base64編碼的一些東西。

包bytes:繼承MessageToMessageEncoder<ByteBuf>。用於字節數組和Netty里面的ByteBuf互相轉換

包compression:用於ByteBuf數據壓縮和解壓縮的。繼承MessageToMessageEncoder<ByteBuf>

包http:用於HTTP請求相關的。這個包里面就比較復雜了。下面詳細講一下。

  1. 包空間:HTTP內容,請求,響應等。
  2. 包cors: 包名稱是(跨域資源分享)Cross Origin Resource Sharing 的簡寫。用於客戶端跨域請求。  可以參考 http://www.w3.org/TR/cors/
  3. 包multipart:POST消息和文件上傳相關的一些。只是粗略看了一下。
  4. 包websocketx:針對近年來Html5發展起來的websocket技術的。不過貌似由於Html5標准還未正式的確定。所以這個包里面的內容比較多。編解碼器版本也很多。相信以后統一標准之后會簡單一些。暫時不推薦吧

包marshalling:

包protoBuf:用於Google Protocol Buffers 編解碼

包rtsp:實時流傳輸協議(Real Time Streaming Protocol,RTSP)

包sctp:流控制傳輸協議(Stream Control Transmission Protocol,SCTP)

包serialization:用於序列化的Java對象的和ByteBuf之間的轉換。

包scoks:用於Java Socket通信相關的。支持Socket4a和 Socket 5兩個版本

包spdy:SPDY協議是近年來發展的一種協議。主要目的是為了減少網頁加載的時間。它是HTTP協議的增強版本。它從某種程度上講提高了HTTP協議在數據傳輸時的速度和性能

包string:用於java里面字符串的編解碼

        

 

 

作者:TinyZ
出處:http://www.cnblogs.com/zou90512/
關於作者:努力學習,天天向上。不斷探索學習,提升自身價值。記錄經驗分享。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接
如有問題,可以通過 zou90512@126.com 聯系我,非常感謝。
筆者網店: http://aoleitaisen.taobao.com. 歡迎廣大讀者圍觀

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM