NIO - Socket 通道
socket 通道有三个类:SocketChannel、ServerSocketChannel 和 DatagramChannel。请注意:DatagramChannel 和 SocketChannel 实现定义读和写功能的接口,而 ServerSocketChannel 不实现。ServerSocketChannel 负责监听传入的连接和创建新的 SocketChannel对象,它本身从不传输数据。
全部 socket 通道类在被实例化时都会创建一个对等 socket 对象。这些是我们所熟悉的来自 java.net 的类(Socket、ServerSocket和DatagramSocket),它们已经被更新以识别通道。对等的 socket 对象可以通过调用通道类的 socket() 方法从通道上获取。此外,这三个 java.net 类现在都有 getChannel()方法。
虽然每个 socket 通道都有一个关联的 java.net socket 对象,却并非所有的 socket 都有一个关联的通道。如果你用传统方式(直接实例化)创建了一个 Socket 对象,它就不会有关联的 SocketChannel 并且它的 getChannel() 方法将总是返回 null。
Socket 通道可以在非阻塞模式下运行。要把一个 socket 通道置于非阻塞模式,我们要依靠所有 socket 通道类的公有超级类:SelectableChannel。下面的方法就是关于通道的阻塞模式的:
public abstract class DatagramChannel extends AbstractSelectableChannel implements ByteChannel, ScatteringByteChannel, GatheringByteChannel { // This is a partial API listing public abstract int read(ByteBuffer dst) throws IOException; public abstract long read(ByteBuffer [] dsts) throws IOException; public abstract long read(ByteBuffer [] dsts, int offset, int length) throws IOException; public abstract int write(ByteBuffer src) throws IOException; public abstract long write(ByteBuffer[] srcs) throws IOException; public abstract long write(ByteBuffer[] srcs, int offset, int length) throws IOException;}read() 方法返回读取字节的数量,如果通道处于非阻塞模式的话这个返回值可能是“0”。write() 方法的返回值同 send() 方法一致:要么返回你的缓冲区中的字节数量,要么返回“0”(如果由于通道处于非阻塞模式而导致数据报不能被发送)。当通道不是已连接状态时调用 read() 或 write() 方法,都将产生 NotYetConnectedException 异常。