系列文章:• 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 ” ©著作权归作者所有 |