相信大多 Web 開發者對 Tomcat 是非常熟悉的,眾所周知 Tomcat 是一款非常好用的開源 Servlet 容器,您一定對這個最流行的 Servlet 容器充滿好奇,雖然它并不像一個黑盒子那樣讓人無法觸摸但是 Tomcat 的源碼的確讓人看起來頭疼。筆者就在這里和大家共同分析一個簡單的 Web服務器是如何工作的源碼 下載地址 。
Web服務器
Web服務器 是一個復雜的系統,一個 Web服務器 要為一個 Servlet 的請求提供服務,需要做三件事:
1 、創建一個 request 對象并填充那些有可能被所引用的 Servlet 使用的信息,如參數、頭部、 cookies 、查詢字符串等等。一個 request 對象是 javax.servlet.ServletRequest 或 javax.servlet.http.ServletRequest 接口的一個實例
2 、創建一個 response 對象,所引用的 servlet 使用它來給客戶端發送響應。一個 response 對象是 javax.servlet.ServletRequest 或 javax.servlet.http.ServletRequest 接口的一個實例。
3 、調用 servlet 的 service 方法,并傳入 request 和 response 對象。這里 servlet 會從 request 對象取值,給 response 寫值。
在正式展示代碼之前還需要了解一些必須額 HTTP 的知識(如果您對此非常熟悉您可以直接看下面分析代碼)
HTTP
HTTP 的定義不知道的童鞋可以自己去度娘,這里主要要說的就是 HTTP 協議的格式
HTTP 請求包括三部分
1 、方法、統一資源標識符( URI )、協議 / 版本
2 、請求的頭部
3 、主題內容
下面是一個 HTTP 請求的例子
第一行表明這是 POST 請求方法, /examples/default.jsp 是 URI , HTTP/1.1 是協議以及版本。其中 URI 指明了一個互聯網資源,這里通常是相對服務器根目錄解釋的,也就是說這個 HTTP 請求就是告訴服務器我需要這個文件目錄如下:根目錄 / examples/default.jsp 。
最后一行是 HTTP 的主題內容, Servlet 會處理請求的主題內容,然后返回給客戶端 HTTP 響應。
類似于 HTTP 請求,一個 HTTP 響應也包括上面三個部分。
1 、方法、統一資源標識符( URI )、協議 / 版本
2 、響應的頭部
3 、主題內容
下面是一個 HTTP 響應的例子
第一行告訴協議版本,以及請求成功( 200 表示成功)
響應頭部和請求頭部一樣,一些有用的信息。響應的主體就是響應本身 HTML 內容。
好了基本知識介紹完畢,下面開始解釋代碼
部分相關代碼
HttpServer 類代表一個 web 服務器。首先提供一個 WEB_ROOT 所在的目錄和它下面所有的子目錄下靜態資源。其次定義了一個中止服務的命令,也就是說當得到的請求后面跟 /shutdown 的時候停止服務,默認是把服務設置為開啟。下面就是進入 main 函數了,首先實例化一個 HttpServer 類,然后就是通過 await 方法等待客戶端發來的請求。如果客戶端輸入的 URL 不是 http://localhost:8080/SHUTDOWN 則表示不停止服務器,然后就是繼續執行 await 方法中的內容,在 await 方法中最重要的就是定義兩個對象,一個是 request 一個是 response ,下面就來說說 Request 和 Response 類。
首先調用 InputStream 對象中的 read 方法獲取 HTTP 請求的原始數據,然后在 parseUri 方法中獲得 uri 也就是要請求的靜態資源。說白了 Request 類的主要作用就是告訴服務器用戶要的是什么也就是在 http://localhost:8080 后面出現的東西。
Response 類代表一個 HTTP 響應。首先 Response 接收一個 OutputStream 對象,然后通過 sendStaticResource 方法對接收的 Request 進行處理,整個處理過程就是根據請求在服務器端進行尋找對應靜態資源的過程。找到所需要的資源后發送給客戶端然后讓客戶端顯示出來。
運行程序
運行上面的 HttpServer 類,然后在瀏覽器的地址欄中鍵入下面的地址: http:localhost:8080/index.jsp ,然后你會在瀏覽器中看到 index.jsp 頁面。
在控制臺可以看到類似于下面的 HTTP 請求
小結
上面自己動手寫的這個所謂的服務器僅僅有三個類組成,從功能上來說他只能顯示一些靜態的資源,并不是全部功能。一個優秀的服務器還有很多細節要做,但是出于學習的目的大家現在有這些了解就足夠了,后面還會有對服務器的詳細介紹,敬請期待。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
