netty封神之路之ChannelHandler

1,018 阅读3分钟

一.ChannelHandler是什么

从应用程序开发人员的角度来看, Netty 的主要组件是 ChannelHandler, 它充当了所有处理入站和出站数据的应用程序逻辑的容器。 ChannelHandler 的方法是由网络事件触发的。事实上, ChannelHandler 可专门用于几乎任何类型的动作, 例如将数据从一种格式转换为另外一种格式, 例如各种编解码, 或者处理转换过程中所抛出的异常。

二.ChannelHandler的类图

三.ChannelInboundHandler和ChannelOutboundHandler有什么区别

ChannelInboundHandler用来处理入站消息,ChannelOutboundHandler用来处理出站消息。

3.1入站事件如下(inbound):

  • channel通道激活与失活(activation and deactivation)
  • 读操作事件;
  • 异常事件;
  • 用户事件;

3.2出站事件很简单,如下(outbound):

  • 打开与关闭连接;
  • 写出或刷新缓冲区数据;

ChannelInboundHandler接口

下面列出了接口 ChannelInboundHandler 的生命周期方法。 这些方法将会在数据被接收时或者与其对应的 Channel 状态发生改变时被调用。 正如我们前面所提到的, 这些方法和Channel 的生命周期密切相关。

channelRegistered 当 Channel 已经注册到它的 EventLoop 并且能够处理 I/O 时被调用

channelUnregistered 当 Channel 从它的 EventLoop 注销并且无法处理任何 I/O 时被调用

channelActive 当 Channel 处于活动状态时被调用; Channel 已经连接/绑定并且已经就绪

channelInactive 当 Channel 离开活动状态并且不再连接它的远程节点时被调用

channelReadComplete 当 Channel 上的一个读操作完成时被调用

channelRead 当从 Channel 读取数据时被调用

ChannelWritabilityChanged当 Channel 的可写状态发生改变时被调用。 可以通过调用 Channel 的 isWritable()方法来检测 Channel 的可写性。 与可写性相关的阈值可以通过

Channel.config().setWriteHighWaterMark()和 Channel.config().setWriteLowWaterMark()方法来

设置userEventTriggered 当
ChannelnboundHandler.fireUserEventTriggered()方法被调用时被调用。

ChannelOutboundHandler 接口

出站操作和数据将由 ChannelOutboundHandler 处理。 它的方法将被 Channel、 ChannelPipeline 以及 ChannelHandlerContext 调用。所有由 ChannelOutboundHandler 本身所定义的方法:

bind(ChannelHandlerContext,SocketAddress,ChannelPromise)当请求将 Channel 绑定到本地地址时被调用

connect(ChannelHandlerContext,SocketAddress,SocketAddress,ChannelPromise)当请求将 Channel 连接到远程节点时被调用

disconnect(ChannelHandlerContext,ChannelPromise)当请求将 Channel 从远程节点断开时被调用

close(ChannelHandlerContext,ChannelPromise) 当请求关闭 Channel 时被调用

deregister(ChannelHandlerContext,ChannelPromise)当请求将 Channel 从它的 EventLoop 注销时被调用

read(ChannelHandlerContext) 当请求从 Channel 读取更多的数据时被调用

flush(ChannelHandlerContext) 当请求通过 Channel 将入队数据冲刷到远程节点时被调

write(ChannelHandlerContext,Object,ChannelPromise) 当请求通过 Channel 将数据写到

远程节点时被调用

ChannelHandler 的适配器有一些适配器类可以将编写自定义的 ChannelHandler 所需要的工作降到最低限度, 因为它们提供了定义在对应接口中的所有方法的默认实现。 因为你有时会忽略那些不感兴趣的事件, 所以 Netty 提供了抽象基类
ChannelInboundHandlerAdapter 和ChannelOutboundHandlerAdapter。