Channel
Channel
Channel对应于Socket。
基本的I/O操作依赖于底层网络传输所提供的原语。在基于Java的网络编程中,其基本的构造是class Socket。Netty的Channel接口所提供的API,大大降低了直接使用Socket类的复杂性。此外,Channel也是拥有许多预定义的、专门化实现的广泛类层次结构的根。
Channel接口介绍
每个Channel都将会被分配一个ChannelPipeline和ChannelConfig。ChannelConfig包含了该Channel的所有配置设置,并且支持热更新。由于特定的传输可能具有独特的设置,所以它可能会实现一个ChannelConfig的子类型。
由于Channel是独一无二的,所以为了保证顺序将Channel声明为java.lang.Comparable的一个子接口。因此,如果两个不同的Channel实例都返回了相同的散列吗,那么AbstractChannel中的compareTo()方法的实现将会抛出一个Error。
Channel的生命周期
Channel定义了一组和ChannelInboundHandler API密切相关的简单但功能强大的状态模型,Channel的生命周期状态如下:
当Channel的状态发生改变时,将会生成对应的事件。这些事件将会被转发给ChannelPipeline中的ChannelHandler,其可以随后对它们做出响应。
状态 | 描述 |
---|---|
ChannelUnregistered | Channel已经被创建,但还未注册到EventLoop |
ChannelRegistered | Channel已经被注册到了EventLoop |
ChannelActive | Channel处于活动状态(已经连接到它的远程节点)。它现在可以接收和发送数据了 |
ChannelInactive | Channel没有连接到远程节点 |
Channel的方法
方法名 | 描述 |
---|---|
eventLoop | 返回分配给Channel的EventLoop |
pipeline | 返回分配给Channel的ChannelPipeline |
isActive | 如果Channel是活动的,则返回true。活动的意义可能依赖于底层的传输。例如,一个Socket传输一旦连接到了远程节点便是活动的,而一个Datagram传输一旦被打开便是活动的 |
localAddress | 返回本地的SocketAddress |
remoteAddress | 返回远程的SocketAddress |
write | 将数据写到远程节点。这个数据将被传递给ChannelPipeline,并且排队直到它被冲刷 |
flush | 将之前已写的数据冲刷到底层传输,如一个Socket |
writeAndFlush | 一个简便的方法,等同于调用write()并接着调用flush() |
内置的传输
Netty内置了一些可开箱即用的传输。因为并不是它们所有的传输都支持每一种协议,所以你必须选择一个和你的应用程序所使用的协议相容的传输。
名称 | 包 | 描述 |
---|---|---|
NIO | io.netty.channel.socket.nio | 使用java.nio.channels包作为基础,基于选择器的方式 |
Epoll | io.netty.channel.epoll | 由JNI驱动的epoll()和非阻塞IO。这个传输支持只有在Linux上可用的多种特性,如SO-REUSEPORT,比NIO传输更快,而且是完全非阻塞的 |
OIO | io.netty.channel.socket.oio | 使用java.net包作为基础,使用阻塞流 |
Local | io.netty.channel.local | 可以在VM内部通过管道进行通信的本地传输 |
Embedded | io.netty.channel.embedded | Embedded传输,允许使用ChannelHandler而又不需要一个真正的基于网络的传输。这在测试ChannelHandler实现时非常有用 |