《Netty学习》(三)Channel学习

来源:互联网 发布:淘宝88会员是什么意思 编辑:程序博客网 时间:2024/06/13 05:43
  • 什么是channel
    • 它是数据在网络传输过程中的载体,拥有着不同的传输类型,包含我们熟悉的阻塞传输(oio)和异步传输(nio),拥有操作底层网络api的能力。
    • 个人理解:如果网络传输像两个岛屿之间的货物传输,那么channel就像那只船。不同的传输类型对应着不同的航行方式。
  • 在netty中Channel

    • 生命周期
      • channelUnregistered
        • channel已经被创建,还没有注册到eventLoop(后面会讲到)
      • channelRegistered
        • 已经注册到eventLoop
      • channelActive
        • channel处于活动状态(连接到远程节点)。可以进行传输
      • channelInactive
        • channel没有连接到远程节点

    这里写图片描述
    因为允许从eventLoop中注销channel,然后重新注册。所以可以看到多个channelUnregistered和channelRegistered之间的变化,但是channelActive和channelInactive永远只有一个。一个channel通道在它的生命周期只能连接一次,之后就会被回收,重新连接会产生新的通道。
    这里写图片描述

    • channel的类结构
      -这里写图片描述

    首先我们能看到channel拥有着AttritubeMap和Comparable接口的能力,使其能成为一个独一无二的载体工具。
    每一个channel都独立拥有一个channelPipeline(管道,监听管理着channel)和channelConfig(配置)

    • channel的api
      • eventLoop 返回该channel的eventLoop
      • pipeline 返回该channel的channelPipeline
      • isActive 是否处于活动状态
      • localAddress 返回绑定的本地SocketAddress
      • remoteAddress 返回连接的远程节点SocketAddress
      • write 写数据
      • flush 冲刷数据
      • writeAndFlush

Netty传输类型

异步传输nio
它使用selector选择器提供了完全异步的方式操作io。选择器基本概念是充当一个注册表,在哪里将请求在channel 的状态发生的变化得到通知,可能的状态变化:
- 新的channel以被接受并且可以使用
- channel 连接完成
- channel 存在可读的数据
- channel 可以写数据

    处理完改变的状态后需要重新设置他们的状态,用一个线程来检查是否有可使用的channel,如果有则执行相关的事件。选择器的所支持的操作在SelectionKey中通过常量定义:    ![这里写图片描述](http://img.blog.csdn.net/20170910152435688?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM3OTM0MzI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)接下来看选择器的处理流程图![这里写图片描述](http://img.blog.csdn.net/20170910153011397?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM3OTM0MzI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
  • Netty支持的其他网络传输类型:
    Epoll:用于linux的本地非阻塞传输
    OIO : 我们熟知的阻塞io (old io);
    Local : 用于jvm内部通信的local传输
    Embedded : 用于单元测试的传输类型
    这里我们主要讲了nio,其他的可以自行扩展。

以上只是我个人理解,仅供参考,如有错误,请包涵指正!

阅读全文
0 0
原创粉丝点击