1. 程式人生 > 其它 >手寫tomcat——編寫一個echo http伺服器

手寫tomcat——編寫一個echo http伺服器

核心程式碼如下:

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通訊流程:

  1. 首先通過建立一個ServerSocket例項, 該例項擁有監聽埠的能力
  2. 通過呼叫serverSocket的accept方法來監聽並接受連線
  3. 當有客戶端連線上來會返回一個socket物件,該物件代表著這次通訊的連線
  4. 通過socket.getInputStream來獲得客戶端向服務端的輸入(流)
  5. 通過socket.getOutputStream來獲得服務端向客戶端的輸出流,並通過呼叫write方法將我們要傳送的資料寫入
  6. 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