Java NIO

# Java NIO >w Java NIO 对于Java BIO的优化 ## Java 非阻塞IO > 及时不使用线程池,也可以处理多个客户端请求 ```java public static void main(String[] args) throws IOException, InterruptedException { LinkedList<SocketChannel> clients = new LinkedList<>(); ServerSocketChannel ss = ServerSocketChannel.open(); ss.bind(new InetSocketAddress(9090)); ss.configureBlocking(false); while (true) { Thread.sleep(1000L); // 非阻塞 SocketChannel client = ss.accept(); if (client == null) { System.err.println("client is null"); } else { client.configureBlocking(false); int port = client.socket().getPort(); System.err.println("client port " + port); clients.add(client); } ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4096); // 串型话 // 真实场景下 每一个client一个独自的buffer for (SocketChannel c : clients) { // -1 出现空轮训 int num = c.read(byteBuffer); if (num > 0) { byteBuffer.flip(); byte[] aaa = new byte[byteBuffer.limit()]; byteBuffer.get(aaa); String b = new String(aaa); System.err.println(c.socket().getPort() + " : " + b); // 清空 循环下一次client在使用 byteBuffer.clear(); } } } } ``` > 以上可以实现,一个线程可以处理多个客户端链接,服务端非阻塞接收,接收之后,读取数据也是非阻塞的; >i NIO的非阻塞是操作系统内部实现的,底层调用了linux内核的accept函数 >d Java的NIO有什么弊端 - 服务端还是会进行空转 - 不管有没有客户端连接建立,服务端都要不断执行accept方法 - 不管客户端连接有没有传输数据,都会执行一遍read操作 > 资源浪费问题 还是会存在C10k的问题