Channel 接口
Channel 介绍
- Nio 的 Channel 与 Netty 的 Channel不是同一个东西!
- Netty 重新设计了 Channel 接口,并给予了很多不同的实现,Channel 是 Netty 的网络抽象类,除了 NIO 中 Channel 所包含的网络 I/O 操作(建立/关闭连接,获取网络地址)之外 ,还包含了 Netty 框架的功能,例如获取 Channel 的 EventLoop、Pipeline 等
- Channel 接口是能与一个 Socket 进行 I/O 操作的纽带
- 通过 Channel 可以获取连接的状态,配置通道的参数,进行 I/O 操作
Channel 基本方法
-
id():返回此通道的全局唯一标识符
-
isActive():如果通过处于活动状态并连接,则返回 true
-
isOpen():如果通道打开并且可能稍后激活,则返回 true
-
isRegistered():如果通道注册了 EventLoop,则返回true
-
config():返回关于此通道的配置
-
localAddress():返回此通道绑定的本地地址
-
pipeline():返回分派的 ChannelPipeline
-
remoteAddress():返回此通道连接到的远程地址
-
flush():请求通过 ChannelOutboundInvoker 将所有挂起的消息输出
关于 Channel 的释放
- 当 Channel 完成工作后,需要调用 ChannelOutboundInvoker.close() 或 ChannelOutboundInvoker.close(ChannelPromise) 释放所有资源,这样做是为了确保所有资源(文件句柄)都能够得到释放
ChannelFuture 接口
ChannelFuture 介绍
-
在 Netty 中所有 I/O 操作都是异步的(包括 bind、write、connect),不能立刻得知消息是否被正确处理,但是所有的操作都会返回一个 ChannelFuture,可以通过其 addListener 方法添加监听器来处理异步操作结果
ChannelFuture 状态
- ChannelFuture 有两种状态:未完成(uncompleted)和完成(completed)
- 当 Channel 开始一个 I/O 操作时,会创建一个新的 ChannelFuture 去异步完成操作
- 被创建时 ChannelFuture 处于 uncompleted 状态(非失败、非成功、非取消),一旦完成 I/O 操作,ChannelFuture 则处于 completed 状态,结果可能有三种:操作成功、操作失败、操作被取消
- Future 是 Java 用来表示异步操作结果的接口,由于 Netty 的 Future 都是与异步 I/O 相关的,因此命名为 ChannelFuture
- 下图是 Netty API 提供的 ChannelFuture 状态迁移图:
+---------------------------+
| Completed successfully |
+---------------------------+
+----> isDone() = true |
+--------------------------+ | | isSuccess() = true |
| Uncompleted | | +===========================+
+--------------------------+ | | Completed with failure |
| isDone() = false | | +---------------------------+
| isSuccess() = false |----+----> isDone() = true |
| isCancelled() = false | | | cause() = non-null |
| cause() = null | | +===========================+
+--------------------------+ | | Completed by cancellation |
| +---------------------------+
+----> isDone() = true |
| isCancelled() = true |
+---------------------------+
ChannelFuture 用法
- 虽然可以通过 ChannelFuture 的 get() 方法获取异步操作结果,但完成时间是无法预测的,若不设置超时时间有可能导致线程长时间被阻塞。因此建议通过监听器来处理异步结果
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ChannelFuture future = ctx.channel().close();
future.addListener(new ChannelFutureListener() {
public void operationComplete(ChannelFuture future) {
// Perform post-closure operation
// ...
}
});
}
网友评论