Netty4.x中文教程系列(四) ChannelHandler


Netty4.x中文教程系列(四)  ChannelHandler

    上一篇文章詳細解釋了Hello World示例的代碼。里面涉及了一些Netty框架的基礎。

    這篇文章用以解釋ChannelHandler。筆者本身在以前寫過文章ChannelHandler改動及影響ChannelInitializer 學習 對Netty的.ChannelHandler做過闡述。里面主要描述了4.x版本相對於3.x版本的改動以及影響。並引用了一些文章。為大家詳細的解釋了ChannelHandler里面涉及架構。

       1.在4.x版本中的ChannelHandler

    ChannelHandler接口是Handler里面的最高的接口。

      ChannelInboundHandler接口和ChannelOutboundHandler接口,繼承ChannelHandler接口。

    流程如下圖:

 

    ChannelInBoundHandler負責數據進入並在ChannelPipeline中按照從上至下的順序查找調用相應的InBoundHandler。

    ChannelOutBoundHandler負責數據出去並在ChannelPipeline中按照從下至上的順序查找調用相應的OutBoundHandler。

       2.在5.x版本中的改動

    在5.x版本中。作者再次對ChannelHandler進行了改動。

    在更新說明里可以看到:

    作者簡化了Handler的類型層次結構。

ChannelInboundHandler和ChannelOutboundHandler接口合並到ChannelHandler里面。

ChannelInboundHandlerAdapter,ChannelOutboundHandlerAdapter以及ChannelDuplexHandlerAdapter被取消,其功能被ChannelHandlerAdapter代替。

由於上述的改動,開發者將無法區分InBoundHandler和OutBoundHandler 所以CombinedChannelDuplexHandler 的功能也被ChannelHandlerAdapter代替。

有興趣了解的可以看一下注釋。假如不看也影響不大。因為5.x看上去改動很大,實際上框架的設計思路並沒有改變。

 

(注釋:

5.x版本中雖然刪除了InBoundHandler和OutBoundHandler,但是在設計思想上InBound和OurBound的概念還是存在的。只不過是作者使用了另外一種方式去實現罷了。

查看過4.x版本代碼的朋友可能已經了解知道了。消息在管道中都是以ChannelHandlerContext的形勢傳遞的。而InBound和OutBound主要作用是被當做ChannelPipeline管道中標識。用於Handler中相對應的調用處理,通過兩個布爾值變量inBound和outBound來區分是進入還是出去。並以此來區分Handler並調用相應的方法,其實沒有什么實際用途。於是作者在5.x版本中對此做出了優化。優化方案筆者感覺very nice。

由於刪除了InBoundHandler和OutBoundHandler的接口。作者在DefaultChannelHandlerContext中重寫了findContextInBound()和findContextOutBound()方法。並且在方法里引入了參數mask。

在類開始處定義靜態終態的變量來標記4.x版本中定義的InBound和OutBound中的方法名(可以變相的認為是枚舉)。在源代碼中的實現是利用mask來獲取對應的flag,最終實現使用mask來區分InBoundHandler亦或是OutBoundHandler。

這樣的改動,優點顯而易見。簡化了層次結構,降低了框架的復雜度。同時功能上卻沒有什么變化。易於使用了解。

)

目前在不涉及框架底層的情況下。筆者將繼續使用Netty 4.0.14 final版本。正如第一章介紹所說。5.x版本作者並沒有進行大規模的設計變更。僅僅只是局部的小部分修改。所以在版本沒有穩定之前。教程都將采用4.0.14final為框架包。

3.認識Handler中的編解碼器

         編解碼器在Netty框架中占了相當大的一部分代碼量。由此可見其重要性。本章內容旨在闡述編解碼器的基礎。下一章會詳細分類的按照框架的結構詳解其余編解碼器。

 

         在Netty的codec包內部我們可以看到很多的編解碼器和一些異常捕獲。

      下一章為大家相熟Handler里面的各種編解碼器。

 

 

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

 


免責聲明!

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



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