Tomdog服務器——手動實現(xiàn)+從源頭了解tomcat基本實現(xiàn)原理以及http協(xié)議

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



