IO模型 | BIO | NIO |
通讯 | 面向流(乡村公路) | 面向缓冲(高速公路,多路复用技术) |
处理 | 阻塞 IO(多线程) | 非阻塞 IO(反应堆 Reactor) |
触发 | 无 | 选择器(轮询机制) |
Name:Tom Age:18 Email: tom@qq.com Phone:13888888888
FileInputStream input = new FileInputStream("d://info.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(input)); String nameLine = reader.readLine(); String ageLine = reader.readLine(); String emailLine = reader.readLine(); String phoneLine = reader.readLine();
ByteBuffer buffer = ByteBuffer.allocate(48); int bytesRead = inChannel.read(buffer);
ByteBuffer buffer = ByteBuffer.allocate(48); int bytesRead = inChannel.read(buffer); while(!bufferFull(bytesRead)) { bytesRead = inChannel.read(buffer); }
package com.gupaoedu.vip.netty.io.aio; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousChannelGroup; import java.nio.channels.AsynchronousServerSocketChannel; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.CompletionHandler; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * AIO 服务端 */ public class AIOServer { private final int port; public static void main(String args[]) { int port = 8000; new AIOServer(port); } public AIOServer(int port) { this.port = port; listen(); } private void listen() { try { ExecutorService executorService = Executors.newCachedThreadPool(); AsynchronousChannelGroup threadGroup = AsynchronousChannelGroup.withCachedThreadPool(executorService, 1); final AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open(threadGroup); server.bind(new InetSocketAddress(port)); System.out.println("服务已启动,监听端口" + port); server.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>(){ final ByteBuffer buffer = ByteBuffer.allocateDirect(1024); public void completed(AsynchronousSocketChannel result, Object attachment){ System.out.println("IO 操做成功,开始获取数据"); try { buffer.clear(); result.read(buffer).get(); buffer.flip(); result.write(buffer); buffer.flip(); } catch (Exception e) { System.out.println(e.toString()); } finally { try { result.close(); server.accept(null, this); } catch (Exception e) { System.out.println(e.toString()); } } System.out.println("操做完成"); } @Override public void failed(Throwable exc, Object attachment) { System.out.println("IO 操做是失败: " + exc); } }); try { Thread.sleep(Integer.MAX_VALUE); } catch (InterruptedException ex) { System.out.println(ex); } } catch (IOException e) { System.out.println(e); } } }
package com.gupaoedu.vip.netty.io.aio; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.CompletionHandler; /** * AIO 客户端 */ public class AIOClient { private final AsynchronousSocketChannel client; public AIOClient() throws Exception{ client = AsynchronousSocketChannel.open(); } public void connect(String host,int port)throws Exception{ client.connect(new InetSocketAddress(host,port),null,new CompletionHandler<Void,Void>() { @Override public void completed(Void result, Void attachment) { try { client.write(ByteBuffer.wrap("这是一条测试数据".getBytes())).get(); System.out.println("已发送至服务器"); } catch (Exception ex) { ex.printStackTrace(); } } @Override public void failed(Throwable exc, Void attachment) { exc.printStackTrace(); } }); final ByteBuffer bb = ByteBuffer.allocate(1024); client.read(bb, null, new CompletionHandler<Integer,Object>(){ @Override public void completed(Integer result, Object attachment) { System.out.println("IO 操做完成" + result); System.out.println("获取反馈结果" + new String(bb.array())); } @Override public void failed(Throwable exc, Object attachment) { exc.printStackTrace(); } }); try { Thread.sleep(Integer.MAX_VALUE); } catch (InterruptedException ex) { System.out.println(ex); } } public static void main(String args[])throws Exception{ new AIOClient().connect("localhost",8000); } }
属性 | 同步阻塞 IO(BIO) | 伪异步 IO | 非阻塞 IO(NIO) | 异步 IO(AIO) |
客户端数:IO 线程数 | 1:1 | M:N(M>=N) | M:1 | M:0 |
阻塞类型 | 阻塞 | 阻塞 | 非阻塞 | 非阻塞 |
同步 | 同步 | 同步 | 同步(多路复用) | 异步 |
API 使用难度 | 简单 | 简单 | 复杂 | 通常 |
调试难度 | 简单 | 简单 | 复杂 | 复杂 |
可靠性 | 很是差 | 差 | 高 | 高 |
吞吐量 | 低 | 中 | 高 | 高 |