手寫一個簡化版Tomcat

Tomcat做爲Web服務器深受市場歡迎,有必要對其進行深刻的研究。在工做中,咱們常常會把寫好的代碼打包放在Tomcat裏並啓動,而後在瀏覽器裏就能愉快的調用咱們寫的代碼來實現相應的功能了,那麼Tomcat是如何工做的?web

1、Tomcat工做原理

咱們啓動Tomcat時雙擊的startup.bat文件的主要做用是找到catalina.bat,而且把參數傳遞給它,而catalina.bat中有這樣一段話:瀏覽器

clipboard.png

Bootstrap.class是整個Tomcat 的入口,咱們在Tomcat源碼裏找到這個類,其中就有咱們常用的main方法:服務器

clipboard.png

這個類有兩個做用 :1.初始化一個守護進程變量、加載類和相應參數。2.解析命令,並執行。多線程

源碼不過多贅述,咱們在這裏只須要把握總體架構,有興趣的同窗能夠本身研究下源碼。Tomcat的server.xml配置文件中能夠對應構架圖中位置,多層的表示能夠配置多個:架構

clipboard.png

即一個由 Server->Service->Engine->Host->Context 組成的結構,從裏層向外層分別是:app

• Server:服務器Tomcat的頂級元素,它包含了全部東西。優化

• Service:一組 Engine(引擎) 的集合,包括線程池 Executor 和鏈接器 Connector 的定義。網站

• Engine(引擎):一個 Engine表明一個完整的 Servlet 引擎,它接收來自Connector的請求,並決定傳給哪一個Host來處理。spa

• Container(容器):Host、Context、Engine和Wraper都繼承自Container接口,它們都是容器。線程

• Connector(鏈接器):將Service和Container鏈接起來,註冊到一個Service,把來自客戶端的請求轉發到Container。

• Host:即虛擬主機,所謂的」一個虛擬主機」可簡單理解爲」一個網站」。

• Context(上下文 ): 即 Web 應用程序,一個 Context 即對於一個 Web 應用程序。Context容器直接管理Servlet的運行,Servlet會被其給包裝成一個StandardWrapper類去運行。Wrapper負責管理一個Servlet的裝載、初始化、執行以及資源回收,它是最底層容器。

好比如今有如下網址,根據「/」切割的連接就會定位到具體的處理邏輯上,且每一個容器都有過濾功能。

clipboard.png

2、梳理本身的Tomcat實現思路

本文實現效果比較簡單,僅供新手參考,大神勿噴。當瀏覽器訪問對應地址時:

clipboard.png

實現以上效果總體思路以下:

1.ServerSocket佔用8080端口,用while(true)循環等待用戶發請求。

2.拿到瀏覽器的請求,解析並返回URL地址,用I/O輸入流讀取本地磁盤上相應文件。

3.讀取文件,不存在構建響應報文頭、HTML正文內容,存在則寫到瀏覽器端。

3、實現本身的Tomcat

工程文件結構和pom.xml文件:

clipboard.png

1.HttpServer核心處理類,用於接受用戶請求,傳遞HTTP請求頭信息,關閉容器:

clipboard.png

2.建立Request類,獲取HTTP的請求頭全部信息並截取URL地址返回:

clipboard.png

3.建立Response類,響應請求讀取文件並寫回到瀏覽器

clipboard.png

4、讀者能夠本身作的優化,擴展的點

1.在WEB_INF文件夾下讀取web.xml解析,經過請求名找到對應的類名,經過類名建立對象,用反射來初始化配置信息,如welcome頁面,Servlet、servlet-mapping,filter,listener,啓動加載級別等。

2.抽象Servlet類來轉碼處理請求和響應的業務。發過來的請求會有不少,也就意味着咱們應該會有不少的Servlet,例如:RegisterServlet、LoginServlet等等還有不少其餘的訪問。能夠用到相似於工廠模式的方法處理,隨時產生不少的Servlet,來知足不一樣的功能性的請求。

3.使用多線程技術。本文的代碼是死循環,且只能有一個連接,而現實中的狀況是每每會有不少不少的客戶端發請求,能夠把每一個瀏覽器的通訊封裝到一個線程當中。

還能作什麼擴展,實現什麼功能,讀者能夠在評論中與我探討。

本文做者:我叫劉半仙

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索