哈尔滨营销网站建设公司seo排名快速
文章目录
- 1.Channel介绍
- 2.ChannelFuture接口介绍
- 3.GenericFutureListener接口介绍
1.Channel介绍
NIO的Channel与Netty的Channel 不一样
Netty重新设计了Channel接口,并且给予了很多不同的实现, Channel是Netty网络的抽象类, 除了NIO中Channel所包含的网络I/O操作, 主动建立和关闭连接外, 还包括了Netty框架的功能, 比如获取Channel的EventLoop和Pipeline。
Channel的基本方法
- id():返回此通道的全局唯一标识符.
- isActive():如果通道处于活动状态并连接,则返回true.
- isOpen():如果通道打开并且可能稍后激活,则返回true.
- isRegistered():如果通道注册了EventLoop,则返回true。
- config():返回关于此通道的配置.
- localAddress():返回此通道绑定的本地地址.
- pipeline():返回分派的ChannelPipeline.
- remoteAddress():返回此通道连接到的远程地址.
- flush():请求通过ChannelOutboundInvoker将所有挂起的消息输出.
- Channel接口是能与一个网络套接字(或组件)进行I/0操作(读取\写入\连接\绑定)的纽带
- 通过Channel可以获取连接的状态(是否连接/是否打开), 配置通道的参数(设置缓冲区大小等), 进行I/O操作
Channel的释放
当Channel完成工作后, 需要调用ChannelOutboundInvoker.close()
或ChannelOutboundInvoker.close(ChannelPromise)
释放所有资源. 这样做是为了确保所有资源(文件句柄)都能够得到释放
2.ChannelFuture接口介绍
Future最早出现于JDK的java.util.concurrent.Future, 表示异步操作的结果, 由于Netty的Future都是与异步I/O操作相关的, 因此命名为ChannelFuture, 代表它与Channel操作相关。
ChannelFuture的作用是用来保存Channel异步操作的结果, 提供了一种在操作完成时通知应用程序的方式。
Channel与ChannelFuture可以说形影不离的。
Channel channel();
ChannelFuture addListener(GenericFutureListener<? extends Future<? super Void>> listener);
ChannelFuture addListeners(GenericFutureListener<? extends Future<? super Void>>... listeners);
ChannelFuture removeListener(GenericFutureListener<? extends Future<? super Void>> listener);
ChannelFuture removeListeners(GenericFutureListener<? extends Future<? super Void>>... listeners);
ChannelFuture sync() throws InterruptedException;
ChannelFuture syncUninterruptibly();
ChannelFuture await() throws InterruptedException;
ChannelFuture awaitUninterruptibly();
- ChannelFuture有两种状态:未完成(uncompleted)和完成(completed)
- 当令Channel开始一个I/O操作时,会创建一个新的ChannelFuture去异步完成操作
- 被创建时的ChannelFuture处于uncompleted状态(非失败,非成功,非取消);一旦ChannelFuture完成I/O操作,ChannelFuture将处于completed状态,结果可能有三种:
- 操作成功
- 操作失败
- 操作取消
3.GenericFutureListener接口介绍
GenericFutureListener是监听接口
优先使用addListener(GenericFutureListener),而非await()或sysn()
- addListener是非阻塞的, 把特定的ChannelFutureListener添加到ChannelFuture中, ChannelFutureListener会利于最佳的性能和资源的利用。
- await()是一个阻塞的操作。
- ChannelFuture的sync()方法, 作用是阻塞main线程, 等到连接建立好程序才向下运行。Channel由主线程获取。
- sync () 会抛出异常, 建议使用 sync (), await () 不会抛出异常, 主线程无法捕捉子线程执行抛出的异常。
- ChannelFuture用addListener()方法。异步调用回调对象的operationComplete方法。
@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) {ChannelFuture future = ctx.channel().close();future.addListener(new ChannelFutureListener() {public void operationComplete(ChannelFuture future) {// Perform post-closure operation// ...}});}
ChannelFutureListener是GenericFutureListener的实现类, 用于添加异步回调事件
ChannelFuture 允许添加一个或多个GenericFutureListener监听接口。
添加监听器源码:
@Overridepublic Promise<V> addListeners(GenericFutureListener<? extends Future<? super V>>... listeners) {checkNotNull(listeners, "listeners");synchronized (this) {for (GenericFutureListener<? extends Future<? super V>> listener : listeners) {if (listener == null) {break;}addListener0(listener);}}if (isDone()) {notifyListeners();}return this;}
addListener0()
负责把用户一个一个添加的listener对象转换为数组结构DefaultFutureListeners, 存储到listeners 成员变量
notifyListeners()
将通知回调任务添加到eventloop当中, eventloop当中的任务顺序就最后是notifyListeners(), 保证了发送消息后, 执行notifyListeners去调用监听器。