netty开发中我们的大部分代码都写在ChannelHandler这部分中,所以需要学习这个重要的接口。
netty中将I/O事件分为了两类:入站(InBound)和出站(OutBound),其中ChannelInboundHandler用于读入IO事件(入站)的处理,ChannelOutboundHandler用于写入IO事件(出站)的处理。
ChannelHandler
用于处理Channel对应的事件,只有三个生命周期方法:
handlerAdded | 当该handler被添加到handlerContext并开始处理IO事件的时候,即pipeline的add方法可以触发 |
handlerRemoved | 从handlerContext中移除的时候,pipeline调用remove的时候 |
exceptionCaught | 用于出现异常的时候,废弃 |
ChannelInboundHandler
提供了ChannelInboundHandlerAdapter适配类,使用的时候只需要关心关注的方法
方法 | 触发时间 |
channelRegistered | channel注册到EventLoop上的时候 |
channelUnregistered | channel在EventLoop取消注册的时候 |
channelActive | channel激活的时候 |
channelInactive | channel不活跃的时候,也就是channel快GG的时候 |
channelRead | 从远端读到数据的时候 |
channelReadComplete | 读完数据之后处理 |
userEventTriggered | 用户事件的触发 |
channelWritabilityChanged | 写状态发生变换的时候 |
每个方法都带了ChannelHandlerContext作为参数,具体作用是,在每个回调事件里面,处理完成之后,使用ChannelHandlerContext的fireChannelXXX方法来传递给下个ChannelHandler。
ChannelInboundHandler
提供了ChannelOutboundHandlerAdapter适配类,使用的时候只需要关心关注的方法
方法 | 触发时间 |
bind | bind操作前 |
connect | connect 操作前 |
close | close操作前 |
deregister | deregister操作前 |
disconnect | disconnect触发前 |
read | read触发前 |
write | write触发前 |
flush | flush触发前 |
ChannelHandlerContext
可以使ChannelHandler与它的pipeLine以及其他ChannelHandler(在同一个pipeline上)进行交互。ChannelHandler可以通知其所属的ChannelPipeline中的下一个ChannelHandler,甚至可以动态修改它所属的ChannelPipeline。每当一个handler添加到pipeline上的时候,都会创建ChannelHandlerContext。
ChannelHandlerContext中的部分方法与Channel和pipeline上也存在。但如果调用channel或者pipeline上的方法,将沿着整个pipeline传递,而调用ChannelHandlerContext的方法,则是将从当前所关联的ChannelHandler开始,并且只会传播给位于该ChannelPipeline中的下一个能够处理该事件的ChannelHandler。因此要想调用从某个特定的ChannelHandler开始的处理过程,必须获取到在(ChannelPipeline)该ChannelHandler之前的ChannelHandler所关联的ChannelHandlerContext,才可以绕过之前的handler。
pipeline
每一个新创建的Channel都将会被分配一个新的ChannelPipeline,就是一个责任链,用于拦截经channel入站和出站事件的handler链。内部是一个双向的链表结构,内部由一个个的ChannelHandlerContext节点组成,ChannelPipeline有头尾两个固定的节点HeadContext与TailContext。用户自定的ChannelHandler就是由ChannelHandlerContext包装成Pipeline的节点,参与Channel整个生命周期中所触发的入站事件与出站事件以及相应数据流的拦截处理。
pipeline添加Handler
主要流程:
- 检查handler是否重复添加
- 创建节点
- 添加,比如addLast方法,将handler添加到pipeline的尾部
- 回调handler的handlerAdded方法
pipeline移除Handler
主要流程:
- 找到handler
- 删除
- 回调handlerRemoved方法
参考:
1.https://www.jianshu.com/p/96a50869b527