1. 程式人生 > >Netty4.x中文教程系列(五)編解碼器Codec

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

原文:http://www.cnblogs.com/zou90512/p/3654163.html

上一篇文章詳細解釋了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:

包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裡面字串的編解碼