Netty源码分析-数据处理器ChannelHandler的设计
日期: 2018-12-23 分类: 跨站数据测试 300次阅读
概述
ChannelHandler用于处理Channel产生的IO事件,如服务端和客户端之间的数据读写read、write,客户端发起连接请求connect,服务端绑定监听端口bind等,用户可以自定义ChannelHandler接口的实现来处理IO事件。以及可以将该IO事件往下传给ChannelPipeline中的下一个ChannelHandler。
ChannelHandler的接口设计
- 在整个IO事件处理体系的接口设计层面,由于Channel产生的IO事件是在ChannelPipeline中进行传播的,ChannelHandlerContext接口负责将ChannelHandler添加到ChannelPipeline,只有这样ChannelHandler才能拦截到Channel产生IO的事件并进行处理;同时ChannelHandlerContext也负责ChannelHandler向ChannelPipeline中相邻的其他ChannelHandler的传播IO事件。ChannelHandler接口自身并不提供如何对IO事件进行处理的方法。
- 故只需要定义添加和删除ChannelHandler到ChannelHandlerContext的方法,而不需要定义对IO事件进行具体处理的方法,这些处理方法由子类定义和实现。
ChannelHandler的子类型
ChannelHandler的子类型主要是根据IO事件是数据读入还是写出来区分:
- ChannelInboundHandler: 处理数据读入IO事件,适配器类为ChannelInboundHandlerAdapter;
- ChannelOutboundHandler: 处理数据写出IO事件,适配器类为ChannelOutboundHandlerAdapter;
- ChannelDuplexHandler:对数据读入和写出IO事件均进行处理。
子类型的具体设计,在之后的文章分析。
ChannelHandlerContext:ChannelHandler的包装器
ChannelHandler只对定义对Channel产生的IO事件的数据进行处理逻辑,而通过ChannelHandlerContext的包装,增强的功能包括:
- 将ChannelHandler接入ChannelPipeline中,使得ChannelHandler可以拦截捕获Channel的IO事件;
- 将ChannelPipeline中的多个ChannelHandler组成一条处理链,实现Channel的IO事件在这些ChannelHandler之间传播;
- ChannelHandler可以通过ChannelHandlerContext对ChannelPipeline动态修改,如添加或删除ChannelHandler
- ChannelHandlerContext通过与AttributeKey的结合使用,使得一个ChannelHandler实例被多个Channel或者是多个ChannelPipeline所共享。通过ChannelHandlerContext来存储,针对每个Channel,在这个共享的ChannelHandler中的特定状态数据,详见下面的分析。
- 关于ChannelHandlerContext的详细分析可以看:
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
上一篇: ofo 遭千万人退押金
精华推荐