一.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。