提供的内置传输
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 |
