Netty入门(二):Channel

JAVA学习网 2021-08-06 15:20:03

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

上图简述了数据被读取后的处理流程,最终通过注册不同的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

每一个新创建的 Channel 都将会被分配一个新的 ChannelPipeline。这项关联是唯一不变的。

核心功能:

  • ChannelPipeline 保存了与 Channel 相关联第一个 ChannelHandler
  • 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会自动释放引用)

 

阅读(38) 评论(0)