經過前三章的容器啟動、組件初始化,Tomcat 終於走到最後一步:Connector 啟動,綁定端口,接收請求。本章聚焦 HTTP/1.1 協議下的 Http11Protocol 與 JIoEndpoint,揭示 ServerSocket.accept() 如何被喚醒。
Connector (生命周期管理)
└─ CoyoteAdapter (適配器,連接 Servlet 容器)
└─ Http11Protocol (協議處理器)
└─ Http11ConnectionHandler (處理器,創建 Processor)
└─ JIoEndpoint (I/O 端點)
└─ Acceptor (內部類,真正執行 accept 循環的線程)
└─ Worker 執行器 (處理請求的線程池)
CoyoteAdapter,調用 protocolHandler.setAdapter(adapter)。protocolHandler(實際調用 AbstractProtocol.init())。mapperListener(處理映射變更)。protocolHandler.start()。mapperListener.start()。public Http11Protocol() {
endpoint = new JIoEndpoint(); // 1. 創建 I/O 端點
handler = new Http11ConnectionHandler(); // 2. 創建連接處理器
((JIoEndpoint) endpoint).setHandler(handler); // 3. 綁定關係
}
endpoint.init() 初始化 JIoEndpoint(創建 ServerSocket)。endpoint.start() → 觸發 JIoEndpoint 啟動監聽線程。AbstractEndpoint
└─ JIoEndpoint (BIO 實現)
└─ Acceptor extends AbstractEndpoint.Acceptor


serverSocketFactory.createServerSocket() 創建 ServerSocket。address:port。executor 為 null 創建默認線程池。AsyncTimeout 定期清理空閒連接。protected class Acceptor extends AbstractEndpoint.Acceptor {
@Override
public void run() {
int errorDelay = 0;
while (running) {
// 暫停狀態下休眠
while (paused && running) {
state = AcceptorState.PAUSED;
Thread.sleep(50);
}
if (!running) break;
state = AcceptorState.RUNNING;
try {
// 連接數限制檢查
countUpOrAwaitConnection();
Socket socket = null;
try {
// ★★★ 關鍵點:阻塞等待客戶端連接 ★★★
socket = serverSocketFactory.acceptSocket(serverSocket);
} catch (IOException ioe) {
countDownConnection();
errorDelay = handleExceptionWithDelay(errorDelay);
throw ioe;
}
errorDelay = 0; // 重置錯誤延遲
// 配置 Socket 參數(TCP_NODELAY, SO_TIMEOUT 等)
if (running && !paused && setSocketOptions(socket)) {
// 分發給 Processor 處理
if (!processSocket(socket)) {
countDownConnection();
closeSocket(socket);
}
} else {
countDownConnection();
closeSocket(socket);
}
} catch (IOException | NullPointerException | Throwable t) {
// 異常日誌記錄
}
}
state = AcceptorState.ENDED;
}
}
夢寐以求的
socket.accept()終於出現! 它在serverSocketFactory.acceptSocket(serverSocket)內部調用。
processSocket(socket) 將 Socket 封裝為 SocketProcessor 任務。executor(線程池)異步執行。SocketProcessor.run() → Http11ConnectionHandler.process() → 創建 Http11Processor 解析請求。adapter.service(request, response) 進入 Servlet 容器(CoyoteAdapter)。| 階段 | 核心類 | 關鍵動作 |
|---|---|---|
| 1. 生命周期 | Lifecycle / LifecycleBase | 統一 init/start/stop 鉤子 |
| 2. 容器架構 | Server, Service, Engine, Host, Context, Wrapper | 層級組合,支持多應用、熱部署 |
| 3. 配置解析 | Digester / Catalina | server.xml → 組件樹;web.xml → Servlet 映射 |
| 4. 協議處理 | Connector, ProtocolHandler, Endpoint | 多協議隔離,BIO/NIO/APR 可插拔 |
| 5. 端口監聽 | JIoEndpoint.Acceptor | 循環 accept(),分發給線程池 |
server.xml 解析機制web.xml 及註解掃描BackgroundProcessor 線程)