SocketChannel & ServerSocketChannel
您目前处于:技术核心竞争力  2015-09-01

与 Socket & ServerSocket 对应,Java NIO 提供了 ServerSocketChannel & SocketChannel 对应。

SocketChannel & ServerSocketChannel

Java NIO 中的 SocketChannel 是一个连接 TCP 网络套接字的通道,ServerSocketChannel 是一个TCP 管道的监听器。

SocketChannel & ServerSocketChannel 在创建的时候都会创建一个对等的 Socket 对象,可以通过 socket() 方法获取,这种方法获取的 socket 可以调用 getChannel() 获取对应的 Channel。

InetSokcetAddress address = new InetSokcetAddress(host, port);

SocketChannel socketChannel = SocketChannel.open();
channel.configureBlocking(false);

// 返回与这个SocketChannel 关联的 Socket 对象. 每个 SocketChannel 对象都与一个 Socket 对象关联.
Socket socket = socketChannel.socket(); 
SocketChannel channel = socket.getChannel();

Socket 和 SocketChannel 封装点对点、有序的网络连接;静态的 open 方法可以创建一个新的 SocketChannel,在 Channel 上调用 Socket 方法能返回对等的 Socket 对象。新创建的 Channel 都是未连接的,可以调用 connect 方法去连接。

socketChannel .connect(address);

Socket & ServerSocket

Socket & ServerSocket 是阻塞式IO,它们的读写分别是 InputStream 和 OutputStream,通过使用 read 和 write 方法。

ServerSocket 的阻塞模式:

public static void main(String[] args) throws Exception {
    ServerSocket ss = new ServerSocket(8989);
    ss.accpet(); // 等待
}

Socket 的 read/write 会阻塞,是因为当 write 成功后,buf 数据被复制到了 kernel 中的 TCP 发送缓冲区中,当 kernel 的 socket 发送缓冲区满时,write 就会被阻塞。

NIO 中的非阻塞

public static void main(String[] args) throws Exception {
    ServerSocketChannel ssc = ServerSocketChannel.open();
    ServerSocket ss = ssc.socket();
    // 设置非阻塞
    ssc.configureBlocking(false);
    ssc.accpet(); // 不需要等待
}

转载请并标注: “本文转载自 linkedkeeper.com ”  ©著作权归作者所有