做過 Java Web 的同學對 Tomcat 再熟悉不過。但在享受其便利時,是否思考過 Tomcat 內部如何運作?本質上 Tomcat 是一個 HTTP 服務器,本文將帶你從零構建一個簡易 HTTP 服務器,窺探核心原理。
Tomcat 核心是 Servlet 容器,代號 Catalina。核心組件:
Request/Response 對象,委派給容器service()這只是冰山一角,容器內部還涉及類加載、安全驗證、會話管理等大量工作。以此為藍圖,開始構建之旅。
Request/Response 封裝請求響應
public class HttpServer {
private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";
private static boolean shutdown = false;
public static void main(String[] args) {
new HttpServer().await();
}
public void await() {
ServerSocket serverSocket = null;
int port = 8080;
try {
serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
} catch (IOException e) { e.printStackTrace(); System.exit(1); }
while (!shutdown) {
Socket socket = null;
InputStream input = null;
OutputStream output = null;
try {
socket = serverSocket.accept();
input = socket.getInputStream();
output = socket.getOutputStream();
Request request = new Request(input);
request.parseUrl();
Response response = new Response(output);
response.setRequest(request);
if (request.getUri().startsWith("/v2/")) {
new ServletProcessor().process(request, response);
} else {
new StaticResourceProcessor().process(request, response);
}
socket.close();
shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
} catch (Exception e) { e.printStackTrace(); System.exit(1); }
}
}
}
關鍵點:ServerSocket 監聽端口,accept() 阻塞等待連接,返回 Socket 進行通信。構造 Request/Response,按 URI 分發處理器。
Request 實現 ServletRequest,核心 parseUrl() 讀取輸入流,解析請求行獲取 URI。
Response 實現 ServletResponse,核心 sendStaticResource() 根據 URI 讀取本地文件輸出,或返回 404。
public class PrimitiveServlet implements Servlet {
public void service(ServletRequest req, ServletResponse res) {
PrintWriter out = res.getWriter();
out.println("Hello. Roses are red.");
out.print("Violets are blue.");
}
// 生命週期方法略
}
ServletProcessor:根據 URI 反射實例化 Servlet,調用 service()StaticResourceProcessor:委派 Response.sendStaticResource()public class Constants {
public static final String WEB_ROOT = System.getProperty("user.dir") + File.separator + "webroot";
}
HttpServer.main()https://localhost:8080/test → 返回 webroot/test 文件內容https://localhost:8080/v2/PrimitiveServlet → 輸出 Servlet 定義的文字

雖功能簡陋,但通過這個最小模型,可清晰理解:
這正是 Tomcat 核心架構的縮影。參考資料:《深入剖析 Tomcat》。