Netty入门(二):Channel

前言

Netty系列索引:

1.Netty入门(一):ByteBuf

2.Netty入门(二):Channel

在Netty框架中,Channel是其中之一的核心概念,是Netty网络通信的主体,由它负责同对端进行网络通信、注册和数据操作等功能。本文我们来详细地分析 Netty 中的 Channel以及跟Channel相关的其他概念,包括ChannelPipeline、ChannelHandlerContext、ChannelHandler等

上图简述了数据被读取后的处理流程,可以看出channel通过pipeline链接了多个Handler并依次执行,类似职责链模式。

Channel

目前可以把 Channel 看作是传入(入站)或者传出(出站)数据的通道,它可以被打开或者被关闭,连接或者断开连接。

Netty对JDK原生的ServerSocketChannel进行了封装和增强, 相对于原生的JdkChannel, Netty的Channel增加了如下的组件

  • id 标识唯一身份信息
  • 可能存在的parent Channel
  • 管道 pepiline,用于链接handler
  • 用于数据读写的unsafe内部类,实际IO操作都是该类实现的
  • 关联唯一的EventLoop,EventGroup->EventLoop->Channel(后续章节再讲,其实就是类似线程池的东西)

channel生命周期

ChannelUnregistered Channel 已经被创建,但还未注册到 EventLoop
ChannelRegistered 已经被注册到了 EventLoop
ChannelActive 处于活动状态(已经连接到它的远程节点)。它现在可以接收和发送数据了
ChannelInactive 没有连接到远程节点

ChannelPipeline

ChannelPipeline是ChannelHandler实例对象的链表,用于处理或截获通道的接收和发送数据。它提供了一种高级的截取过滤模式(类似serverlet中的filter功能),让用户可以在ChannelPipeline中完全控制一个事件以及如何处理ChannelHandler与ChannelPipeline的交互。

每个Channel,都会创建一个唯一的ChannelPipeline

ChannelPipeline 可以根据需要,通过添加或者删除 ChannelHandler 来动态地修改(典型应用,动态修改协议等)

ChannelPipeline 有着丰富的 API 用以被调用,以响应入站和出站事件。

ChannelHandlerContext

ChannelHandlerContext类似上下文的概念,代表了 ChannelHandler 和 ChannelPipeline 之间的关联,每当有 ChannelHandler 添加到 ChannelPipeline 中时,都会创建 ChannelHandlerContext。

ChannelHandlerContext 的主要功能是管理它所关联的 ChannelHandler 和在同一个 ChannelPipeline 中的其他 ChannelHandler 之间的交互。

核心功能:

  • ChannelHandlerContext使得ChannelHandler能够和它的ChannelPipeline以及其他的ChannelHandler 交互。
  • ChannelHandler 可以通知其所属的 ChannelPipeline 中的下一个ChannelHandler
  • ChannelHandlerContext 具有丰富的用于处理事件和执行 I/O 操作的 API

ChannelHandler

生命周期:

handlerAdded 当把 ChannelHandler 添加到 ChannelPipeline 中时被调用
handlerRemoved 当从 ChannelPipeline 中移除 ChannelHandler 时被调用
exceptionCaught 当处理过程中在 ChannelPipeline 中有错误产生时被调用

ChannelInboundHandler 的方法

ChannelOutboundHandler 的方法

内存泄漏监控

在使用handler处理ByteBuf时,应正确处理其被引用次数,尤其是调用read和write后,应正确释放其引用。

(注意:SimpleChannelInboundHandler会自动释放引用)


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!