NIO 編程

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

相關文章
相關標籤/搜索