# Tomcat # ——web服務器的內部實現原理剖析及實戰"Tomdog"

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中得到輸入流以獲取信息解析
  • 解析
    1. 請求行
      • 進一步解析協議版本、請求資源、請求方式以及通過get方式發送過來的參數(跟在url后面的)分別放入成員變量中并根據需要提供get、set方法,所有參數放入成員變量parameters中
    2. 消息頭
      • 將消息頭的鍵值對解析并放入成員變量Map<String> headers中
    3. 消息正文
      • 根據消息頭中的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()進行響應

  1. 發送狀態行
  2. 發送響應頭
  3. 發送響應正文
  • 從socket中得到輸出流,將響應信息全部寫入輸出流以進行信息返回三者數據


    image.png

三、響應

  • 向客戶端返回發送響應,所有響應信息已經由tomdog打包進request中,并由底層按照計算機網絡協議通過輸出流裝進socket中,轉化為二進制信息通過網絡傳輸到客戶端。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373