Easy Netty 系列(五):ChannelHandlerContext详解

ChannelHandlerContext 的主要功能是关联 ChannelPipeline 与 ChannelHandler 然后管理 ChannelHandler,另一方面是管理和同一个 Pipeline 中的其他 Handler 的交互,也就是 Handler 之间的事件传递。

ChannelHandlerContext 的能力

image

通过上图里的方法可以看出 ChannelHandlerContext 的能力:

  • 获取 ByteBuf 分配器
  • 获取绑定的 Channel
  • 获取绑定的 Pipeline
  • 进行事件通知,以 fire* 开头的方法
  • 连接管理(bindconnectdisconnect)
  • 数据读写(writewiriteAndFlushread)

ChannelHandlerContext 与 Channel、ChannelPipeline 的关系

image

说明:

  1. 每一个 ChannelHandlerContext 与一个 ChannelHandler 绑定,一旦关联不会改变,因此缓存 ChannelHandlerConntext 是安全的
  2. 每一个 ChannelHandlerContext 也与一个 ChannelPipeline 关联,关联后不会改变
  3. 使用 ChannelHandlerContext 的方法触发的事件从下一个节点流转,而使用 Pipeline、Channel 产生的事件从 pipeline 头部流转。

特殊情况:由于 ChannelHandler 可以是共享的,也就是说可以和多个 Pipeline 关联,此时 ChannelHandler 对于每一个关联的 Pipeline 都创建一个 ChannelHandlerContext。

ChannelHandlerContext 应用

  1. 缓存起来,在其他方法或线程中使用(因为 ChannelHandlerContext 的绑定是不变的可以放心使用)
  2. 控制 pipeline,实现协议的切换

EOF : -)