1. NIO 比 传统 IO 有什么优势?java
答:NIO 一个 线程 能够监听多个客户端,传统 客户端 -- 服务端模型中,一个线程监听一个客户端,致使线程消耗过多,一个线程要分配0.5M~1M内存。socket
2. NIO服务端客户端模型线程
// 建立一个selector Selector selector = Selector.open(); // 建立一个ServerSocketChannel ServerSocketChannel servChannel = ServerSocketChannel.open(); servChannel.configureBlocking(false); // 绑定端口号 servChannel.socket().bind(new InetSocketAddress(8080), 1024); // 注册感兴趣事件 servChannel.register(selector, SelectionKey.OP_ACCEPT); // select系统调用 selector.select(1000); Set<SelectionKey> selectedKeys = selector.selectedKeys(); Iterator<SelectionKey> it = selectedKeys.iterator(); SelectionKey key = null; while (it.hasNext()) { key = it.next(); it.remove(); if (key.isValid()) { // 处理新接入的请求消息 if (key.isAcceptable()) { ServerSocketChannel ssc = (ServerSocketChannel) key.channel(); // 接收客户端的链接,并建立一个SocketChannel SocketChannel sc = ssc.accept(); sc.configureBlocking(false); // 将SocketChannel和感兴趣事件注册到selector sc.register(selector, SelectionKey.OP_READ); } if (key.isReadable()) { // 读数据的处理 } } }
3. NIO 怎样使用?code
答:事件
(1)通道绑定端口内存
(2)服务端Channel/客户端Channel 注册事件到Selector上rem
(3)select方法阻塞,获取被选中的key,根据key找到channelit