Tomdog服務器——手動實現+從源頭了解tomcat基本實現原理以及http協議
Tomdog-webserver-SystemArchitecture_畫板 1.png
以上圖片是tomdog服務器(手寫翻版的tomcat)的內部實現結構,其實現了tomcat的基本原理層,通過此過程我們可以了解一個請求流程的整體過程和內部原理。
源代碼Tomdog——tomcat的手寫翻版地址:http稍后上傳
源代碼TomdogExample——開發的符合tomdog規范的webapp案例(類似開發一個由tomcat運行的webapp)地址:http稍后上傳
零、咱們的web服務器是一個運行在服務端機器上的軟件。
- 它運行并初始化后,循環監聽發來的請求,accept()方法一旦收到請求,創建一個客戶端處理線程ClientHandler,負責后續的處理(為了保護性能,tomdog會把所有處理線程放入線程池進行管理,默認最大并發量為可在代碼中設置)。
- 初始化的過程中,ServerContext、HttpContext中會通過靜態代碼塊,預加載tomdog.xml、web.xml并掃描webapp下所有掛在的第三方webapp,加載其對應的web.xml并根據配置內容然后掃描、加載所有內部的servlet類文件、并將加載的類對象、servlet以映射形式存在map中,以備后用。
開始請求流程
一、用戶使用客戶端軟件進行請求
- 客戶端軟件(瀏覽器、APP、小程序等各類具有網絡通信功能的應用)向服務器端的web服務器(軟件tomcat)發送請求。客戶端將請求信息打包進request中,并按照計算機網絡協議裝進socket中,轉化為二進制信息通過網絡傳輸到服務器。
二、web服務器軟件工作
2.1準備工作
2.1.1創建Httprequest對象并解析請求
- Httprequest對象構造方法中初始化
- 從socket中得到輸入流以獲取信息解析
- 解析
- 請求行
- 進一步解析協議版本、請求資源、請求方式以及通過get方式發送過來的參數(跟在url后面的)分別放入成員變量中并根據需要提供get、set方法,所有參數放入成員變量parameters中
- 消息頭
- 將消息頭的鍵值對解析并放入成員變量Map<String> headers中
- 消息正文
-
根據消息頭中的Content-Type區分正文類型,作進一步解析,通過post方式發送的參數數據會在這里出現,解析后放入Map<String,Object> parameters
image.png
-
- 請求行
2.1.2創建Httpresponse對象——初始化響應對象
-
準備一些默認值即可
image.png
2.2處理請求
2.2.1處理流程如圖
- 交給默認的servlet進行處理,接下來即一般不是請求一些文件資源,就是請求了特定servlet并移交處理
-
在springMVC框架中,DispatcherServlet充當了這里的特定servlet,并在后續轉交給用戶定義的controller進行處理。
image.png
2.3響應客戶端
2.3.1調用response.flush()進行響應
- 發送狀態行
- 發送響應頭
- 發送響應正文
-
從socket中得到輸出流,將響應信息全部寫入輸出流以進行信息返回三者數據
image.png
三、響應
- 向客戶端返回發送響應,所有響應信息已經由tomdog打包進request中,并由底層按照計算機網絡協議通過輸出流裝進socket中,轉化為二進制信息通過網絡傳輸到客戶端。