Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >跨站数据测试

Netty源码分析-数据处理器ChannelHandler的设计

概述

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事件是数据读入还是写出来区分:

  1. ChannelInboundHandler: 处理数据读入IO事件,适配器类为ChannelInboundHandlerAdapter;
  2. ChannelOutboundHandler: 处理数据写出IO事件,适配器类为ChannelOutboundHandlerAdapter;
  3. ChannelDuplexHandler:对数据读入和写出IO事件均进行处理。
    子类型的具体设计,在之后的文章分析。

ChannelHandlerContext:ChannelHandler的包装器

ChannelHandler只对定义对Channel产生的IO事件的数据进行处理逻辑,而通过ChannelHandlerContext的包装,增强的功能包括:

  1. 将ChannelHandler接入ChannelPipeline中,使得ChannelHandler可以拦截捕获Channel的IO事件;
  2. 将ChannelPipeline中的多个ChannelHandler组成一条处理链,实现Channel的IO事件在这些ChannelHandler之间传播;
  3. ChannelHandler可以通过ChannelHandlerContext对ChannelPipeline动态修改,如添加或删除ChannelHandler
  4. ChannelHandlerContext通过与AttributeKey的结合使用,使得一个ChannelHandler实例被多个Channel或者是多个ChannelPipeline所共享。通过ChannelHandlerContext来存储,针对每个Channel,在这个共享的ChannelHandler中的特定状态数据,详见下面的分析。

上一篇: ofo 遭千万人退押金

下一篇: 恕我直言,在座的各位根本不会写 Java!

精华推荐