91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

源碼時代JAVA干貨分享 | 利用NIO模擬實現Tomcat容器!

發布時間:2020-06-28 04:17:17 來源:網絡 閱讀:312 作者:wx5d51393e4bd0e 欄目:編程語言

NIO是什么
New IO,始于Java1.4,提供新的非阻塞 JavaIO 操作API.
又稱Non-Blocking IO 非阻塞IO
替代舊版本的Blocking IO, 多用于網絡相關的API.

為什么要使用NIO
使用NIO后,WEB網絡程序性能可以進一步提高
源碼時代JAVA干貨分享 | 利用NIO模擬實現Tomcat容器!
模擬Tomcat7, 阻塞IO處理Http請求:

public class BIOHttpServer {
public static void main(String[] args) throws IOException {
ServerSocket socket = new ServerSocket(8080);
System.out.println(Thread.currentThread().getName()+"啟動:"+8080);
while(true){
Socket accept = socket.accept();
InputStream inputStream = accept.getInputStream();
byte[] b = new byte[1024];
inputStream.read(b);
System.out.println(new String(b));

            // http響應頭 必須這樣寫:
            String response = "HTTP/1.1 200 ok\r\nContent-Length: 11\r\n\r\nHello World\r\n";
            accept.getOutputStream().write(response.getBytes());
            accept.getOutputStream().flush();
            accept.close();         
    }
}

}

NIO高性能的核心原理:
發起連接
操作系統接收連接
TCP模塊 + 多路復用機制
一個Java線程通過Selector工具選擇性處理
有數據傳輸的交給線程池
最終達到,線程最大程度利用

源碼時代JAVA干貨分享 | 利用NIO模擬實現Tomcat容器!

使用NIO:

模擬Tomcat8.5, NIO處理Http請求:
public class NIOHttpServer {
public static void main(String[] args) throws IOException {

    // 1.ServerSocketChannel 綁定端口
    ServerSocketChannel socket = ServerSocketChannel.open();
    socket.configureBlocking(false); // no-Blocking
    socket.bind(new InetSocketAddress(8080));

    System.out.println("NIO服務器啟動,端口:"+8080);

    // 2.獲取新連接 
    // selector 獲取不同操作系統下不同的tcp連接動態
    Selector selector = Selector.open();

    // 選擇器,根據條件查詢符合情況地TCP連接
    socket.register(selector, SelectionKey.OP_ACCEPT);

    while(true){
        selector.select(1000); //如果沒有新連接,就等待

        // 3. 處理查詢結果
        Set<SelectionKey> keys = selector.selectedKeys();
        Iterator<SelectionKey> iterator = keys.iterator();

        while(iterator.hasNext()){
            SelectionKey result = iterator.next();

            //根據不同的類型,分別進行處理
            if(result.isAcceptable()){ //3.1 拿到新連接對象
                // nio體現,accept 不阻塞,沒有連接則返回null
                SocketChannel accept = socket.accept();
                if(accept!=null){
                    // 注冊連接對象,進行關注
                    accept.configureBlocking(false);// no-Blocking
                    accept.register(selector, SelectionKey.OP_READ);
                }
            }
            if(result.isReadable()){ //3.2 有數據請求的連接
                SocketChannel channel = (SocketChannel) result.channel();
                // 處理過程中,先取消selector對應連接的注冊,避免重復
                result.cancel();

                // NIO的讀寫方式: 字節緩沖區
                ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
                channel.read(byteBuffer);
                byteBuffer.flip(); //模式轉換
                byte[] b = byteBuffer.array();
                String request = new String(b);

                //處理請求... 
                System.out.println(request);

                //數據響應:NIO的寫數據
                String response = "HTTP/1.1 200 ok\r\nContent-Length: 11\r\n\r\nHello World\r\n";
                channel.write(ByteBuffer.wrap(response.getBytes()));

                // 處理完成,重新注冊,繼續接收處理新的連接
                // channel.register(selector, SelectionKey.OP_READ);
            }
            // 刪除處理過的結果(事件)
            iterator.remove();
        }   

        // 檢查過程就緒,清除之前的調用效果
        selector.selectNow();
    }
}

}
源碼時代JAVA干貨分享 | 利用NIO模擬實現Tomcat容器!

(本文章由源碼時代技術老師原創,轉載請注明出處!)

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

名山县| 吉木乃县| 蒲城县| 舟山市| 嘉祥县| 九龙坡区| 永康市| 禄劝| 九寨沟县| 桦南县| 嘉峪关市| 恩平市| 格尔木市| 来安县| 拉孜县| 营口市| 民县| 中江县| 密云县| 龙岩市| 龙山县| 汶川县| 浠水县| 凭祥市| 赣榆县| 兰西县| 临潭县| 囊谦县| 岳阳县| 含山县| 扎鲁特旗| 麦盖提县| 内江市| 五大连池市| 峨眉山市| 龙南县| 外汇| 驻马店市| 峨山| 云阳县| 林周县|