Netty 學習3. ChannelHandler 、ChannelHandlerContext、ChannelPipeline

首先先分析一下ChannelHandler,ChannelHandler是我們?nèi)粘i_發(fā)中使用最多的組件了,大概我們平時寫的最多的組件就是Handler了。

屏幕快照 2018-04-06 上午8.51.48.png

我們平時繼承的最多的就是ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter,這兩個不是接口也不是抽象類,所以我們可以僅僅重寫我們需要的方法,沒有必須要實現(xiàn)的方法,當然我們也會使用SimpleChannelInboundHandler。

ChannelHandler,ChannelHandlerContext,ChannelPipeline這三者的關(guān)系很特別,相輔相成,一個ChannelPipeline中可以有多個ChannelHandler實例,而每一個ChannelHandler實例與ChannelPipeline之間的橋梁就是ChannelHandlerContext實例,如圖所示:

image.png

看圖就知道,ChannelHandlerContext的重要性了,如果你獲取到了ChannelHandlerContext的實例的話,你可以獲取到你想要的一切,你可以根據(jù)ChannelHandlerContext執(zhí)行ChannelHandler中的方法,我們舉個例子來說,我們可以看下ChannelHandlerContext部分API:

fireChannelActive : 觸發(fā)下一個ChannelInboundHandler的ChannelActive()方法
fireChannelInActive : 觸發(fā)下一個ChannelInboundHandler的ChannelInActive()方法
fireChannelRead :觸發(fā)下一個ChannelInboundHandler的ChannelRead()方法
fireChannelReadComplete: 觸發(fā)下一個ChannelInboundHandler的ChannelReadComplete ()方法
handler:返回這個實例上的ChannelHandler

這幾個API都是使用比較頻繁的,都是調(diào)用當前handler之后同一類型的channel中的某個方法,這里的同一類型指的是同一個方向,比如inbound調(diào)用inbound,outbound調(diào)用outbound類型的channel,一般來說,都是一個channel的ChannnelActive方法中調(diào)用fireChannelActive來觸發(fā)調(diào)用下一個handler中的ChannelActive方法。

當channelPipeline中有多個channelHandler時,且這些channelHandler中有同樣的方法時,例如這里的channelActive方法,只會調(diào)用處在第一個的channelHandler中的channelActive方法,如果你想要調(diào)用后續(xù)的channelHandler的同名的方法就需要調(diào)用以“fire”為開頭的方法了,這樣做很靈活。

我的Github項目,歡迎大家指導(dǎo)!Watch!Star!Fork! Thanks!
GitHub-Netty-demo-server
GitHub-Netty-demo-client

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容