提供的内置传输

Netty内置了一些开箱即用的传输,因为不是所有的传输都支持每种协议,所以必须选择一个与协议相对应的传输。
提供的传输策略如下:

名称 所属包 描述
NIO io.netty.channel.socket.nio 使用JDK的java.nio.channels包作为基础-基于选择器
Epoll io.netty.channel.epoll 由JNI驱动的epoll()和非阻塞IO,这个传输支持只有在Linux上可用的多种特性,如SO_REUSEPORT,比NIO传输更快,而且是完全非阻塞的
OIO io.netty.channel.socket.oio 使用JDK的java.net包作为基础-使用阻塞流
Local io.netty.channel.local 可以在JVM内部通过管道进行通信的本地传输
Embedded io.netty.channel.embedded Embedded传输,允许使用ChannelHandler而又不需要一个真正的基于网络的传输,常用在测试ChannelHandler实现

NIO传输-非阻塞IO

提供一个所有IO操作全异步的实现,利用jdk1.4中NIO包提供的选择器的API。Netty则对NIO做了一些封装处理隐藏了它的内部细节。

Epoll-用于Linux的本地非阻塞传输

Netty的NIO基于JDK提供的非阻塞网络编程的抽象,这保证了Netty可以在任何平台运行,但也包含了相应的限制,因为JDK在所有系统上提供相同的功能必须做出妥协。
Linux作为高性能的网络编程平台,催生了大量的先进特性,其中就包括了epoll-一个高度可扩展的IO事件通知特性。

OIO-旧的阻塞IO

关注OIO是如何实现的,OIO使用和异步传输相同的API实现,利用SO_TIMEOUT这个Socket标志,指定等待一个IO操作完成的最大毫秒数,通过抛出异常并捕获异常继续循环处理,在EventLoop下次运行时将再次尝试。

Local-用于JVM内部通信的传输

和服务器Channel相关联的SockerAddress并没有绑定物理网络地址,只要服务器还在运行,它就会被存储在注册表里,并在Channel关闭时注销。因为这个传输并不接受真正的网络流量,所以不能够和其他传输实现进行交互,且客户端连接到这个传输的服务器也必须使用同一个JVM。

Embedded传输

将一组ChannelHandler作为帮助类嵌入到其他的ChannelHandler内部,通过这种方式可以扩展一个ChannelHandler的功能,而又不需要修改其内部代码。

最佳传输用例推荐

需求 推荐传输
非阻塞代码库或者一个常规起点 NIO(或者在NIO上使用epoll)
阻塞代码库 OIO
在同一个JVM内部通信 Local
测试ChannelHandler的实现 Embedded