手寫tomcat——編寫一個echo http伺服器
阿新 • • 發佈:2021-10-03
核心程式碼如下:
public class DiyTomcat1 { public void run() throws IOException { ServerSocket serverSocket = new ServerSocket(8080); System.out.println("======服務啟動成功========"); while (!serverSocket.isClosed()) { Socket socket = serverSocket.accept(); InputStream inputStream = socket.getInputStream(); System.out.println("執行客戶請求:" + Thread.currentThread()); System.out.println("收到客戶請求"); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "utf-8")); String msg = null; while ((msg = reader.readLine()) != null) { if (msg.length() == 0) { break; } System.out.println(msg); } String rspHeaderStr = "HTTP/1.1 200" + "\r\n" + "Content-Type:text/html" + "\r\n\r\n"; String resp = rspHeaderStr + "OK"; OutputStream outputStream = socket.getOutputStream(); System.out.println("=====rsp===="); System.out.println(resp); outputStream.write(resp.getBytes()); outputStream.flush(); outputStream.close(); socket.close(); } } }
這是一個最基本的socket通訊流程:
- 首先通過建立一個ServerSocket例項, 該例項擁有監聽埠的能力
- 通過呼叫serverSocket的accept方法來監聽並接受連線
- 當有客戶端連線上來會返回一個socket物件,該物件代表著這次通訊的連線
- 通過socket.getInputStream來獲得客戶端向服務端的輸入(流)
- 通過socket.getOutputStream來獲得服務端向客戶端的輸出流,並通過呼叫write方法將我們要傳送的資料寫入
- String rspHeaderStr = "HTTP/1.1 200" + "\r\n" + "Content-Type:text/html" + "\r\n\r\n"; 是為了構造出一個http 協議的頭部,方便客戶端解析(如果是瀏覽器http請求過來,可以方便瀏覽器直接展示處理)
程式碼地址:
https://github.com/ZhongJinHacker/diy-tomcat/tree/base-tomcat