首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

從零手寫 Java 簡易 HTTP 伺服器:Socket 實現請求解析與回應封裝

     編輯:Java 相關知識

HTTP 協議基礎

Web 伺服器與客戶端通訊基於 HTTP 協議(基於 TCP)。理解請求/回應格式是手寫伺服器的關鍵。

請求報文結構

GET / HTTP/1.1
Host: 127.0.0.1
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 ...
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8


POST /?test=123 HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 8

name=bob

解析規則:

  1. 第一行:方法、路徑+查詢參數、HTTP 版本,空格分隔。
  2. 後續行:Header,Key: Value 格式,以 \r\n 換行。
  3. 一個空行分隔 Header 與 Body。
  4. Body 為提交資料(表單、JSON 等)。

回應報文結構

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html
Content-Length: 129
Date: Mon, 22 Feb 2016 08:08:32 GMT


testthis is test page.

解析規則:

  1. 第一行:HTTP 版本、狀態碼、狀態描述。
  2. Header 區塊。
  3. 空行。
  4. Body 內容。

核心代碼實現

ServerSocket 監聽與請求讀取

ServerSocket serverSocket = new ServerSocket(80);
Socket socket = serverSocket.accept();
InputStream in = socket.getInputStream();
// 讀取並解析請求行、Header、Body...

發送回應

OutputStream out = socket.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write("HTTP/1.1 200 OK\r\n");
writer.write("Content-Type: text/html;charset=UTF-8\r\n");
writer.write("Content-Length: " + body.length() + "\r\n");
writer.write("\r\n");
writer.write(body);
writer.flush();

完整測試範例

使用 JUnit 測試 Server 端與 Client 端溝通,驗證請求解析與回應封裝正確性。

擴展方向

  • 支援多執行緒處理併發請求(ThreadPool)。
  • 解析 Query String、Form Data、JSON Body。
  • 實現靜態資源服務、動態路由分發。
  • 支援 HTTPS、Chunked Transfer Encoding。

本文為手寫 HTTP 伺服器的起步基礎,掌握協議細節後可逐步構建功能完整的輕量級伺服器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved