標籤:

netty的編/解碼器有什麼分類背景(netty-in-action中沒有對此部分詳細陳述)?

解碼器分為以下三種:

  • 解碼位元組到消息
  • 解碼消息到消息
  • 解碼消息到位元組

編碼器分為以下兩種:

  • 消息對象編碼成消息對象
  • 消息對象編碼成位元組碼


您好,在這裡我們可以發現,在Netty中,ChannelHandler實際上分為兩個定向類型,即入站的(inbound)和出站的(outbound),如果我們套用類型系統,就可以放心這裡其實是個sum type,即ChannelHandler擁有 ChannelInboundHandler 和 ChannelOutboundHandler這兩個子介面。

進一步,入站方向的,即解碼器,都繼承了 ChannelInboundHandlerAdapter ,而出站方向的,即編碼器,都繼承了 ChannelOutboundHandlerAdater。

至於為何會有這樣的分類,其實很簡單,首先,在網路上傳輸的數據都是位元組,其次在我們Java中處理的都是對象,也就是Bean。

那麼就有 位元組數據 和 對象的相互轉換,以及對象和對象的相互轉化了。這也就是 Netty 中為何有

ByteToMessage、MessageToByte 以及 MessageToMessage。

實際上,我們如果把他們看做是一個函數的話,比如在Akka Stream中,無論是編碼器還是解碼器,我們都可以看做是Function1[A,B],即Flow& 或者 Flow&。對於編解碼器甚至有BidiFlow

所以整體來說,Netty中這樣的劃分,主要是:

1. 出於對兩種轉換的抽象

2. 出於對編程模型的簡化

如果真的是全函數式的思維,那麼就是上面這種了,心智負擔就稍微大了一些。

至於上面提到的Akka,推薦:

《Akka 入門與實踐》 —— 入門,本書是入門的 Akka 書,可以保證您快速地上手 Akka,譯者也是摩根的大牛,清華高材生,雖然只是入門書。


推薦閱讀:

如何評價《Netty實戰》這本書?
關於應用層解決拆包粘包問題?
通俗地講,Netty 能做什麼?
Netty的Reactor線程組中的每個Reactor線程處理網路I/O為什麼一定要串列化,並行化不是更能提高系統吞吐量嗎?
為什麼nio效率會比bio高?

TAG:NIO | Netty |