跳至主要內容

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-lifecycle-sp.png

当Channel的状态发生改变时,将会生成对应的事件。这些事件将会被转发给ChannelPipeline中的ChannelHandler,其可以随后对它们做出响应。

状态描述
ChannelUnregisteredChannel已经被创建,但还未注册到EventLoop
ChannelRegisteredChannel已经被注册到了EventLoop
ChannelActiveChannel处于活动状态(已经连接到它的远程节点)。它现在可以接收和发送数据了
ChannelInactiveChannel没有连接到远程节点

Channel的方法

方法名描述
eventLoop返回分配给Channel的EventLoop
pipeline返回分配给Channel的ChannelPipeline
isActive如果Channel是活动的,则返回true。活动的意义可能依赖于底层的传输。例如,一个Socket传输一旦连接到了远程节点便是活动的,而一个Datagram传输一旦被打开便是活动的
localAddress返回本地的SocketAddress
remoteAddress返回远程的SocketAddress
write将数据写到远程节点。这个数据将被传递给ChannelPipeline,并且排队直到它被冲刷
flush将之前已写的数据冲刷到底层传输,如一个Socket
writeAndFlush一个简便的方法,等同于调用write()并接着调用flush()

内置的传输

Netty内置了一些可开箱即用的传输。因为并不是它们所有的传输都支持每一种协议,所以你必须选择一个和你的应用程序所使用的协议相容的传输。

名称描述
NIOio.netty.channel.socket.nio使用java.nio.channels包作为基础,基于选择器的方式
Epollio.netty.channel.epoll由JNI驱动的epoll()和非阻塞IO。这个传输支持只有在Linux上可用的多种特性,如SO-REUSEPORT,比NIO传输更快,而且是完全非阻塞的
OIOio.netty.channel.socket.oio使用java.net包作为基础,使用阻塞流
Localio.netty.channel.local可以在VM内部通过管道进行通信的本地传输
Embeddedio.netty.channel.embeddedEmbedded传输,允许使用ChannelHandler而又不需要一个真正的基于网络的传输。这在测试ChannelHandler实现时非常有用
上次编辑于:
贡献者: Neil