Netty系列索引:
在Netty框架中,Channel是其中之一的核心概念,是Netty网络通信的主体,由它负责同对端进行网络通信、注册和数据操作等功能。本文我们来详细地分析 Netty 中的 Channel以及跟Channel相关的其他概念,包括ChannelPipeline、ChannelHandlerContext、ChannelHandler等
上图简述了数据被读取后的处理流程,可以看出channel通过pipeline链接了多个Handler并依次执行,类似职责链模式。
目前可以把 Channel 看作是传入(入站)或者传出(出站)数据的通道,它可以被打开或者被关闭,连接或者断开连接。
Netty对JDK原生的ServerSocketChannel进行了封装和增强, 相对于原生的JdkChannel, Netty的Channel增加了如下的组件
channel生命周期
ChannelUnregistered
Channel 已经被创建,但还未注册到 EventLoop
ChannelRegistered
已经被注册到了 EventLoop
ChannelActive
处于活动状态(已经连接到它的远程节点)。它现在可以接收和发送数据了
ChannelInactive
没有连接到远程节点
ChannelPipeline是ChannelHandler实例对象的链表,用于处理或截获通道的接收和发送数据。它提供了一种高级的截取过滤模式(类似serverlet中的filter功能),让用户可以在ChannelPipeline中完全控制一个事件以及如何处理ChannelHandler与ChannelPipeline的交互。
每个Channel,都会创建一个唯一的ChannelPipeline
ChannelPipeline 可以根据需要,通过添加或者删除 ChannelHandler 来动态地修改(典型应用,动态修改协议等)
ChannelPipeline 有着丰富的 API 用以被调用,以响应入站和出站事件。
ChannelHandlerContext类似上下文的概念,代表了 ChannelHandler 和 ChannelPipeline 之间的关联,每当有 ChannelHandler 添加到 ChannelPipeline 中时,都会创建 ChannelHandlerContext。
ChannelHandlerContext 的主要功能是管理它所关联的 ChannelHandler 和在同一个 ChannelPipeline 中的其他 ChannelHandler 之间的交互。
核心功能:
生命周期:
handlerAdded
当把 ChannelHandler 添加到 ChannelPipeline 中时被调用
handlerRemoved
当从 ChannelPipeline 中移除 ChannelHandler 时被调用
exceptionCaught
当处理过程中在 ChannelPipeline 中有错误产生时被调用
ChannelInboundHandler 的方法
ChannelOutboundHandler 的方法
内存泄漏监控
在使用handler处理ByteBuf时,应正确处理其被引用次数,尤其是调用read和write后,应正确释放其引用。
(注意:SimpleChannelInboundHandler会自动释放引用)
手机扫一扫
移动阅读更方便
你可能感兴趣的文章