這一篇部落格開始将和大家一起使用java編寫一個簡易的web伺服器。
衆所周知web伺服器與用戶端之間的通信是使用http協定的。http是一個用戶端和伺服器端請求和應答的标準(tcp)。因為http協定是基于tcp協定的,是以我将使用java中的socket完成這個簡易的web伺服器。關于http更詳細的資料,各位可以查閱相關資料進行了解。
在伺服器編寫之前,我們還是先來看一下浏覽器與伺服器之間通信的規則到底如何。
首先,我們是用<code>serversocket</code>來模拟一個服務端,通過浏覽器通路,檢視浏覽器請求的内容:
使用junit運作,并通過浏覽器通路:<code>http://127.0.0.1</code>,我們可以看到控制台上輸出浏覽器的請求内容如下:
為了更好的分析請求内容,我們編寫一個html頁面送出一些資料,再次檢視請求内容:
在輸入框中輸入bob,點選按鈕送出,觀察控制台輸出:
我們來分析一下這段請求内容:
第一行:由三部分組成,中間以空格分開,第一部分為請求方法(get、post),第二部分為請求路徑以及查詢參數,第三部分為http協定版本(http/1.1)
第二行到第十行:請求的頭資訊,請求頭名稱與值之間通過<code>:</code>分隔
第十一行:空行
第十二行:送出的表單内容
綜上,我們可以得到如下結論:請求資訊第一行為請求方法、請求路徑以及查詢參數、http協定版本,通過<code>\r\n</code>換行後緊跟着請求頭資訊,各頭資訊之間通過<code>\r\n</code>換行,請求頭資訊結束後跟着一個空行,空行之後緊跟着一行為請求資料,需要注意的是,這裡面隻模拟了最簡單的表單送出,至于複雜的檔案送出等,這裡面不讨論,請求内容格式略有不同。
至此,用戶端請求的内容我們已經知道了,下面我們再來看看服務端在接收到請求後響應資料的格式,我們建立一個web項目用于測試,編輯html頁面内容如下:
啟動伺服器,然後編寫用戶端測試代碼,獲得服務端傳回資料:
運作程式獲得伺服器傳回内容如下:
同樣的,我們來分析一下這段傳回消息:
第一行由三部分組成,中間以空格分開,第一部分為http協定版本(http/1.1),第二部分為響應狀态碼,第三部分為響應狀态描述
第二行到第七行為響應頭資訊,響應頭名稱與值之間通過<code>:</code>分隔
第八行:空行
第九行到結束:響應内容
綜上,我們可以得到如下結論:請求資訊第一行為http協定版本、響應狀态碼、響應狀态描述,通過<code>\r\n</code>換行後緊跟着響應頭資訊,各頭資訊之間通過<code>\r\n</code>換行,響應頭資訊結束後跟着一個空行,空行之後緊跟着響應資料,需要注意的是,除這種響應外,其實還有其他的相應方式,比如chunk,此處不讨論,可查閱相關資料。
到現在為止,我們已經分析完了用戶端的請求内容格式以及服務端相應内容的格式,這一篇就到此為止了,接下來的部落格中,我們将一步一步的進行伺服器端的編寫。