Easy Netty 系列(五):ChannelHandlerContext详解
ChannelHandlerContext 的主要功能是关联 ChannelPipeline 与 ChannelHandler 然后管理 ChannelHandler,另一方面是管理和同一个 Pipeline 中的其他 Handler 的交互,也就是 Handler 之间的事件传递。
ChannelHandlerContext 的能力
通过上图里的方法可以看出 ChannelHandlerContext 的能力:
- 获取 ByteBuf 分配器
- 获取绑定的 Channel
- 获取绑定的 Pipeline
- 进行事件通知,以
fire*
开头的方法 - 连接管理(
bind
、connect
、disconnect
) - 数据读写(
write
、wiriteAndFlush
、read
)
ChannelHandlerContext 与 Channel、ChannelPipeline 的关系
说明:
- 每一个 ChannelHandlerContext 与一个 ChannelHandler 绑定,一旦关联不会改变,因此缓存 ChannelHandlerConntext 是安全的
- 每一个 ChannelHandlerContext 也与一个 ChannelPipeline 关联,关联后不会改变
- 使用 ChannelHandlerContext 的方法触发的事件从下一个节点流转,而使用 Pipeline、Channel 产生的事件从 pipeline 头部流转。
特殊情况:由于 ChannelHandler 可以是共享的,也就是说可以和多个 Pipeline 关联,此时 ChannelHandler 对于每一个关联的 Pipeline 都创建一个 ChannelHandlerContext。
ChannelHandlerContext 应用
- 缓存起来,在其他方法或线程中使用(因为 ChannelHandlerContext 的绑定是不变的可以放心使用)
- 控制 pipeline,实现协议的切换
EOF : -)