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