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. 歡迎廣大讀者圍觀