15
Java NIO 简明教程 之 Java NIO 数据报通道(DatagramChannel)
Java NIO 中的 DatagramChannel 是一个可以发送、接收 UDP 数据包的通道。由于 UDP 是面向无连接的网络协议,所以不能像使用其他通道那样直接进行读写数据。正确的做法是发送、接收数据包。
Java NIO 中的 DatagramChannel 是一个可以发送、接收 UDP 数据包的通道。由于 UDP 是面向无连接的网络协议,所以不能像使用其他通道那样直接进行读写数据。正确的做法是发送、接收数据包。
现在你已经知道了 Java NIO 里面那些非阻塞特性是怎么工作的,但是要设计一个非阻塞的服务仍旧比较困难。非阻塞 IO 相对传统的阻塞 IO 给开发者带来了更多的挑战。在本节非阻塞服务的讲解中,我们一起来讨论这些会面临的主要挑战,同时也会给出一些潜在的解决方案。
在 Java NIO 中的 ServerSocketChannel 是用于监听新连接的 TCP 通道, 就像标准 IO 中的 ServerSocket 一样。ServerSocketChannel 类在 java.nio.channels包中。
在 Java NIO 体系中,SocketChannel 是用于 TCP 网络连接的套接字接口,相当于 Java 网络编程中的 Socket 套接字接口。创建 SocketChannel 主要有两种方式,如下:
Java NIO 中的 FileChannel 是用于连接文件的通道(Channel)。通过 FileChannel 可以读、写文件的数据。Java NIO 的 FileChannel 是相对标准 Java IO API 的可选接口。
FileChannel 不可以设置为非阻塞模式,他只能在阻塞模式下运行。
选择器(Selector) 是 Java NIO 中用于检查一个或多个NIO Channel 状态是否处于可读、可写的组件。如此可以实现单线程管理多个 channel,从而可以管理多个网络链接。
在 Java NIO 中你可以从一个通道向另一个通道直接传输数据,如果一个 channel 是 FileChannel 类型的,那么他可以直接把数据传输到另一个 channel。逐个特性得益于FileChannel 类包含的 transferTo() 和 transferFrom() 两个方法。
Java NIO 内置了scatter/gather(分散/聚合)的支持,分散/聚合时通过通道(Channel)读写数据的两个概念。
分散读(Scattering read)是指从通道(Channel)中读取操作时将读取的数据写入多个缓冲区(Buffer)中,也就是 Scatter 代表了数据从通道(Channel)到多个缓冲区(Buffer)的过程。