跳至主要內容

ChannelHandlerContext


ChannelHandlerContext

ChannelHandlerContext代表了ChannelHandler和ChannelPipeline之间的关联。每当有ChannelHandler添加到ChannelPipeline中时,都会创建ChannelHandlerContext。ChannelHandlerContext的主要功能是管理它所关联的ChannelHandler和在同一个ChannelPipeline中的其他ChannelHandler之间的交互。

ChannelHandlerContext使得ChannelHandler能够和它的ChannelPipeline以及其他的ChannelHandler交互。ChannelHandler可以通知其所属的ChannelPipeline中的下一个ChannelHandler,甚至可以动态修改它所属的ChannelPipeline。

当ChannelHandler被添加到ChannelPipeline时,它将会被分配一个ChannelHandlerContext,其代表了ChannelHandler和ChannelPipeline之间的绑定。虽然这个对象可以被用于获取底层的Channel,但是它主要还是被用于写出站数据。

在Netty中,有两种发送消息的方式。你可以直接写到Channel中,也可以写到和ChannelHandler相关联的ChannelHandlerContext对象中。前一种方式将会导致消息从ChannelPipeline的尾端开始流动,而后者将导致消息从ChannelPipeline中的下一个ChannelHandler开始流动。

ChannelHandlerContext有很多的方法,其中一些方法也存在于Channel和ChannelPipeline本身上,但是有一点重要的不同。如果调用Channel或者ChannelPipeline上的这些方法,它们将沿着整个ChannelPipeline进行传播。而调用位于ChannelHandlerContext上的相同方法,则将从当前所关联的ChannelHandler开始,并且只会传播给位于该ChannelPipeline中的下一个能够处理该事件的ChannelHandler。

API

方法名称描述
alloc返回和这个实例相关联的Channel所配置的ByteBufAllocator
bind绑定到给定的SocketAddress,并返回ChannelFuture
channel返回绑定到这个实例的Channel
close关闭Channel,并返回ChannelFuture
connect连接给定的SocketAddress,并返回ChannelFuture
deregister从之前分配的EventExecutor注销,并返回ChannelFuture
disconnect从远程节点断开,并返回ChannelFuture
executor返回调度事件的EventExecutor
fireChannelActive触发下一个ChannelInboundHandler上的channelActive()方法(已连接)的调用
fireChannelInactive触发下一个ChannelInboundHandler上的channelInactive()方法(已关闭)的调用
fireChannelRead触发下一个ChannelInboundHandler上的channelRead()方法(已接收的消息)的调用
fireChannelReadComplete触发下一个ChannelInboundHandler上的
fireChannelRegistered触发下一个ChannelInboundHandler上的
fireChannelUnregistered触发下一个ChannelInboundHandler上的
fireChannelWritabilityChanged触发下一个ChannelInboundHandler上的
fireExceptionCaught触发下一个ChannelInboundHandler上的
fireUserEventTriggered触发下一个ChannelInboundHandler上的
handler返回绑定到这个实例的ChannelHandler
isRemoved如果所关联的ChannelHandler已经被从ChannelPipeline中移除则返回true
name返回这个实例的唯一名称
pipeline返回这个实例所关联的ChannelPipeline
read将数据从Channel读取到第一个入站换中去:如果读取成功则触发一个channelRead事件,并(在最后一个消息被读取完成后)通知ChannelInboundHandler的channelReadComplete(ChannelHandlerContext)方法))
write通过这个实例写入消息并经过ChannelPipeline
writeAndFlush通过这个实例写入并冲刷消息并经过ChannelPipeline

当使用ChannelHandlerContext的API时候,请牢记以下两点:

  • ChannelHandlerContext和ChannelHandler之间的关联(绑定)是永远不会改变的,所以缓存对它的引用是安全的;
  • 相对于其他类的同名方法,ChannelHandlerContext的方法将产生更短的事件流,应该尽可能地利用这个特性来获得最大的性能。
上次编辑于:
贡献者: Neil