美文网首页Java 杂谈深入浅出Netty源码剖析
Netty(十四):Channel 和 ChannelFutur

Netty(十四):Channel 和 ChannelFutur

作者: 聪明的奇瑞 | 来源:发表于2018-07-13 11:59 被阅读8次

    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
                 // ...
             }
         });
     }
    

    相关文章

      网友评论

        本文标题:Netty(十四):Channel 和 ChannelFutur

        本文链接:https://www.haomeiwen.com/subject/zuejpftx.html