netty(三)--传输

传输 API 的核心是 interface Channel, 它被用于所有的 I/O 操作。
在这里插入图片描述
如图所示, 每个 Channel 都将会被分配一个 ChannelPipeline 和 ChannelConfig。
ChannelConfig 包含了该 Channel 的所有配置设置, 并且支持热更新。
ChannelPipeline 持有所有将应用于入站和出站数据以及事件的 ChannelHandler 实例,这些 ChannelHandler 实现了应用程序用于处理状态变化以及数据处理的逻辑。
ChannelHandler 的典型用途包括:

  • 将数据从一种格式转换为另一种格式;
  • 提供异常的通知;
  • 提供 Channel 变为活动的或者非活动的通知;
  • 提供当 Channel 注册到 EventLoop 或者从 EventLoop 注销时的通知;
  • 提供有关用户自定义事件的通知。
    在这里插入图片描述
名称 描述
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 实现时非常有用

选择器背后的基本概念是充当一个注册表,在那里你将可以请求在 Channel 的状态发生变化时得到通知。可能的状态变化有:

  • 新的 Channel 已被接受并且就绪;
  • Channel 连接已经完成;
  • Channel 有已经就绪的可供读取的数据;
  • Channel 可用于写数据

在这里插入图片描述
Linux作为高性能网络编程的平台,其重要性与日俱增,这催生了大量先进特性的开发, 其在这里插入图片描述中包括epoll——一个高度可扩展的I/O事件通知特性。 这个API自Linux内核版本 2.5.44(2002)被引入,提供了比旧的POSIX select和poll系统调用 更好的性能,同时现在也是Linux上非阻塞网络编程的事实标准。 Linux JDK NIO API使用了这些epoll调用。

猜你喜欢

转载自blog.csdn.net/ljz2016/article/details/82838864
今日推荐