瀏覽器-伺服器-請求與響應,瀏覽器響應
瀏覽器訪問伺服器,本質就是請求資源。
比如請求靜態資源:index.html,我們在瀏覽器地址欄輸入:www.a.com/index.html,瀏覽器為了支援HTTP協議,發送的資料必須符合HTTP協議資料的格式,也就是這樣:
GET /index.html HTTP/1.1 Accept-Language:zh-cn Connection:Keep-Alive Host:www.a.com User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0) Accept-Encoding:gzip,deflate
這些資訊就成了請求資訊,瀏覽器利用Socket,通過網路IO流發往伺服器。如果做個比喻的話,瀏覽器比作男生,伺服器比作女生,我想表達的意思是,瀏覽器是主動連結,並且主動請求資料,也就是想要的資源,而伺服器存在資源,她只會等待瀏覽器主動請求她,她才會做出響應。
此時伺服器必須已經開啟,因為她要監聽某一個連接埠才能知道有人給她發資訊了,這裡比如是 80 連接埠。伺服器監聽80連接埠,有點類似於事件驅動編程的感覺,伺服器利用ServerSocket,得到請求資訊。伺服器解析請求資訊,得到需要請求的資源。這裡先簡單一分為二:
1 請求靜態資源:
伺服器將會去伺服器實現定義好的工作目錄下,也是我們網站發布打包後的檔案存放的地方,尋找a.html檔案,若找到使用IO流,將檔案載入到記憶體中,設定狀態代碼為200,再輸出到網路IO流,發送給瀏覽器,瀏覽器接收到響應資訊,截取響應體,使用渲染引擎(所謂的核心)進行渲染。若找不到檔案,則伺服器設定回應標頭為404,我們可以自訂一句話來說明原因,大多數伺服器返回404 File Not Found。這就是我們載入靜態檔案的流程。
2 請求動態資源servlet:
先說說動態語言,即運行時才能得知變數的類型。而動態資源,就是未執行的.class檔案,得到瀏覽器的請求資訊,伺服器執行一系列的事先定義好的.class檔案,得到一個動態結果返回給瀏覽器。
做個比喻,好比靜態資源就是你要買一輛普通的車,你就直接到車店,發送請求給車店,車店得到請求,解析它,知道你要買哪輛,然後返回給你汽車(有些癡人說夢哈)。動態資源呢,就是,你要私人定製一個豪華車,然後你就去汽車廠,發送請求給汽車廠,汽車廠得到請求之後,解析它,獲得一些有用資訊:車大小,裡面配置,外表裝飾等等,請注意,這裡沒有現成的車直接返回,而是得通過一系列的生產車間動態產生,等到生產完成,返回定製汽車,串連關閉。
比喻打完,開始說正常流程。伺服器得到瀏覽器發來的請求資訊之後,解析它,得到了要執行的類名。這裡就用到了【反射】,個人感覺反射技術很偉大,雖然確實降低效能,但是降低了類與類之間的耦合,就好比動態資源,我不清楚如果沒有反射,我們將如何獲得動態資源。得到想要的類名,利用反射,得到該類的對象,執行想要的方法,然後返回結果。
註:此文章針對Java應用伺服器Tomcat,至於其它伺服器的請求和響應原理,我沒做考證,所以我沒將猜測說出來。
2016-08-31 09:02:16
欲戴王冠,必承其重