<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ### EndPoint `EndPoint`是通信端點,即通信監聽的接口,是具體的 Socket 接收和發送處理器,是對傳輸層的抽象,因此`EndPoint`是用來實現`TCP/IP`協議數據讀寫的,本質調用操作系統的 socket 接口。 `EndPoint`是一個接口,對應的抽象實現類是`AbstractEndpoint`,而`AbstractEndpoint`的具體子類,比如在`NioEndpoint`和`Nio2Endpoint`中,有兩個重要的子組件:`Acceptor`和`SocketProcessor`。 其中 Acceptor 用于監聽 Socket 連接請求。`SocketProcessor`用于處理`Acceptor`接收到的`Socket`請求,它實現`Runnable`接口,在`Run`方法里調用應用層協議處理組件`Processor`進行處理。為了提高處理能力,`SocketProcessor`被提交到線程池來執行 我們知道,對于 Java 的多路復用器的使用,無非是兩步: 1. 創建一個 Seletor,在它身上注冊各種感興趣的事件,然后調用 select 方法,等待感興趣的事情發生。 2. 感興趣的事情發生了,比如可以讀了,這時便創建一個新的線程從 Channel 中讀數據。 在 Tomcat 中`NioEndpoint`則是`AbstractEndpoint`的具體實現,里面組件雖然很多,但是處理邏輯還是前面兩步。它一共包含`LimitLatch`、`Acceptor`、`Poller`、`SocketProcessor`和`Executor`共 5 個組件,分別分工合作實現整個 TCP/IP 協議的處理。 * LimitLatch 是連接控制器,它負責控制最大連接數,NIO 模式下默認是 10000,達到這個閾值后,連接請求被拒絕。 * `Acceptor`跑在一個單獨的線程里,它在一個死循環里調用`accept`方法來接收新連接,一旦有新的連接請求到來,`accept`方法返回一個`Channel`對象,接著把`Channel`對象交給 Poller 去處理。 * `Poller`的本質是一個`Selector`,也跑在單獨線程里。`Poller`在內部維護一個`Channel`數組,它在一個死循環里不斷檢測`Channel`的數據就緒狀態,一旦有`Channel`可讀,就生成一個`SocketProcessor`任務對象扔給`Executor`去處理。 * SocketProcessor 實現了 Runnable 接口,其中 run 方法中的`getHandler().process(socketWrapper, SocketEvent.CONNECT_FAIL);`代碼則是獲取 handler 并執行處理 socketWrapper,最后通過 socket 獲取合適應用層協議處理器,也就是調用 Http11Processor 組件來處理請求。Http11Processor 讀取 Channel 的數據來生成 ServletRequest 對象,Http11Processor 并不是直接讀取 Channel 的。這是因為 Tomcat 支持同步非阻塞 I/O 模型和異步 I/O 模型,在 Java API 中,相應的 Channel 類也是不一樣的,比如有 AsynchronousSocketChannel 和 SocketChannel,為了對 Http11Processor 屏蔽這些差異,Tomcat 設計了一個包裝類叫作 SocketWrapper,Http11Processor 只調用 SocketWrapper 的方法去讀寫數據。 * `Executor`就是線程池,負責運行`SocketProcessor`任務類,`SocketProcessor`的`run`方法會調用`Http11Processor`來讀取和解析請求數據。我們知道,`Http11Processor`是應用層協議的封裝,它會調用容器獲得響應,再把響應通過`Channel`寫出。 工作流程如下所示: ![](https://img.kancloud.cn/b7/bf/b7bfa5da4f936a18e0f4e49863630b14_1658x1156.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看