Netty笔记 --- ChannelHandler

     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适配类,使用的时候只需要关心关注的方法

方法触发时间
channelRegisteredchannel注册到EventLoop上的时候
channelUnregisteredchannel在EventLoop取消注册的时候
channelActivechannel激活的时候
channelInactivechannel不活跃的时候,也就是channel快GG的时候
channelRead从远端读到数据的时候
channelReadComplete读完数据之后处理
userEventTriggered用户事件的触发
channelWritabilityChanged写状态发生变换的时候

    每个方法都带了ChannelHandlerContext作为参数,具体作用是,在每个回调事件里面,处理完成之后,使用ChannelHandlerContext的fireChannelXXX方法来传递给下个ChannelHandler。

ChannelInboundHandler

    提供了ChannelOutboundHandlerAdapter适配类,使用的时候只需要关心关注的方法

方法触发时间
bindbind操作前
connectconnect 操作前
closeclose操作前
deregisterderegister操作前
disconnectdisconnect触发前
readread触发前
writewrite触发前
flushflush触发前

 

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

主要流程:

  1. 检查handler是否重复添加
  2. 创建节点
  3. 添加,比如addLast方法,将handler添加到pipeline的尾部
  4. 回调handler的handlerAdded方法

pipeline移除Handler

主要流程:

  1. 找到handler
  2. 删除
  3. 回调handlerRemoved方法

参考:

1.https://www.jianshu.com/p/96a50869b527

2.https://www.jianshu.com/p/96a50869b527

3.https://www.jianshu.com/p/607501fdeb92

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值