- 什么是channel
- 它是数据在网络传输过程中的载体,拥有着不同的传输类型,包含我们熟悉的阻塞传输(oio)和异步传输(nio),拥有操作底层网络api的能力。
- 个人理解:如果网络传输像两个岛屿之间的货物传输,那么channel就像那只船。不同的传输类型对应着不同的航行方式。
在netty中Channel
- 生命周期
- channelUnregistered
- channel已经被创建,还没有注册到eventLoop(后面会讲到)
- channelRegistered
- 已经注册到eventLoop
- channelActive
- channel处于活动状态(连接到远程节点)。可以进行传输
- channelInactive
- channel没有连接到远程节点
- channelUnregistered
因为允许从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,其他的可以自行扩展。
以上只是我个人理解,仅供参考,如有错误,请包涵指正!