|
您目前处于:Development
2015-09-01
|
系列文章:• Netty Channel.isWritable 返回 false • ocketChannel & ServerSocketChannel 与 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 ” ©著作权归作者所有 |