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

我們平時繼承的最多的就是ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter,這兩個不是接口也不是抽象類,所以我們可以僅僅重寫我們需要的方法,沒有必須要實現(xiàn)的方法,當然我們也會使用SimpleChannelInboundHandler。
ChannelHandler,ChannelHandlerContext,ChannelPipeline這三者的關(guān)系很特別,相輔相成,一個ChannelPipeline中可以有多個ChannelHandler實例,而每一個ChannelHandler實例與ChannelPipeline之間的橋梁就是ChannelHandlerContext實例,如圖所示:

看圖就知道,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