《Netty学习》(三)Channel学习

本文介绍了Netty中的Channel,它是网络传输过程中的载体,具备不同传输类型如阻塞(oio)和异步(nio)。Channel在Netty中具有唯一性,其生命周期包括未注册、注册、活动和不活动状态。每个Channel有自己的ChannelPipeline和ChannelConfig。文章还讨论了Selector在NIO中的作用以及Netty支持的其他传输类型如Epoll、OIO和Local。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 什么是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中通过常量定义:

这里写图片描述

接下来看选择器的处理流程图

这里写图片描述

  • Netty支持的其他网络传输类型:
    Epoll:用于linux的本地非阻塞传输
    OIO : 我们熟知的阻塞io (old io);
    Local : 用于jvm内部通信的local传输
    Embedded : 用于单元测试的传输类型
    这里我们主要讲了nio,其他的可以自行扩展。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值