Netty 学习3. ChannelHandler 、ChannelHandlerContext、ChannelPipeline

首先先分析一下ChannelHandler,ChannelHandler是我们日常开发中使用最多的组件了,大概我们平时写的最多的组件就是Handler了。

Netty 学习3. ChannelHandler 、ChannelHandlerContext、ChannelPipeline_第1张图片
屏幕快照 2018-04-06 上午8.51.48.png

我们平时继承的最多的就是ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter,这两个不是接口也不是抽象类,所以我们可以仅仅重写我们需要的方法,没有必须要实现的方法,当然我们也会使用SimpleChannelInboundHandler。

ChannelHandler,ChannelHandlerContext,ChannelPipeline这三者的关系很特别,相辅相成,一个ChannelPipeline中可以有多个ChannelHandler实例,而每一个ChannelHandler实例与ChannelPipeline之间的桥梁就是ChannelHandlerContext实例,如图所示:

Netty 学习3. ChannelHandler 、ChannelHandlerContext、ChannelPipeline_第2张图片
image.png

看图就知道,ChannelHandlerContext的重要性了,如果你获取到了ChannelHandlerContext的实例的话,你可以获取到你想要的一切,你可以根据ChannelHandlerContext执行ChannelHandler中的方法,我们举个例子来说,我们可以看下ChannelHandlerContext部分API:

fireChannelActive : 触发下一个ChannelInboundHandler的ChannelActive()方法
fireChannelInActive : 触发下一个ChannelInboundHandler的ChannelInActive()方法
fireChannelRead :触发下一个ChannelInboundHandler的ChannelRead()方法
fireChannelReadComplete: 触发下一个ChannelInboundHandler的ChannelReadComplete ()方法
handler:返回这个实例上的ChannelHandler

这几个API都是使用比较频繁的,都是调用当前handler之后同一类型的channel中的某个方法,这里的同一类型指的是同一个方向,比如inbound调用inbound,outbound调用outbound类型的channel,一般来说,都是一个channel的ChannnelActive方法中调用fireChannelActive来触发调用下一个handler中的ChannelActive方法。

当channelPipeline中有多个channelHandler时,且这些channelHandler中有同样的方法时,例如这里的channelActive方法,只会调用处在第一个的channelHandler中的channelActive方法,如果你想要调用后续的channelHandler的同名的方法就需要调用以“fire”为开头的方法了,这样做很灵活。

我的Github项目,欢迎大家指导!Watch!Star!Fork! Thanks!
GitHub-Netty-demo-server
GitHub-Netty-demo-client

你可能感兴趣的:(Netty 学习3. ChannelHandler 、ChannelHandlerContext、ChannelPipeline)