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
解析規則:
Key: Value 格式,以 \r\n 換行。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 GMTtest this is test page.
解析規則:
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)。本文為手寫 HTTP 伺服器的起步基礎,掌握協議細節後可逐步構建功能完整的輕量級伺服器。