本篇文章旨在從服務器後台開發的角度剖析一個簡單的http服務器的運行原理.
我們知道浏覽器是http(s)的客戶端,目的是連接遠程的http服務器,然後服務器返回浏覽器數據.浏覽器接收數據解析數據之後展現出來.我們看到的外在表現就是,浏覽器訪問一個url,然後就得到相應的web頁面.
同樣我們知道,浏覽器與http服務器是通過http協議,傳輸層是tcp協議,因為他是有連接,可靠的協議.關于http協議簡單的介紹一下:
一個标準的HTTP請求由以下幾個部分組成
<request-line>
<headers>
<CRLF>
[<request-body><CRLF>]
在HTTP請求中,第一行是請求行(request-line),用來說明請求類型、要訪問的資源(URL)以及使用的HTTP版本;緊接着是多行頭部(headers)信息,用來說明服務器要使用的附加信息;頭部信息之後是一個回車換行符(\r\n),用于标明頭部信息的結束。以上是必須内容,根據需要可在頭部信息結束之後增加主體數據(request-body);
主體數據之後是一個回車換行符(\r\n),用于标明主體數據的結束。
例如,我們可以在IE浏覽器上輸入下面的網址:
http://localhost:8000/hello/index.html
GET /hello/index.html HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
Host: localhost:8000
Connection: Keep-Alive
Cookie: JSESSIONID=BBBA54D519F7A320A54211F0107F5EA6
收到請求數據之後,服務器解析,畢竟是明文字符,這個簡單.然後服務器就知道了客戶端的要求--獲取目錄hello/index.html文件.服務器讀取文件内容發送給浏覽器就好了.
後來随着業務邏輯越來越複雜,單單獲取某個html文件功能早已不能滿足需求,個性化需求呼之欲出.比如在線問卷調查表,他究竟是怎麼把我們填寫的數據傳遞給服務器的呢?
你可能會說那不是一樣,客戶端發送什麼内容,服務器就接收什麼内容.可是你想過沒有,每個網站的需求是不一樣的,本來服務器接收到浏覽器的請求數據已經是夠複雜的了,還讓服務器來解析數據并響應不同的數據處理,這不太現實.
一般的,服務器最好隻接收數據,如果讓服務器也處理數據邏輯,勢必會讓服務器變得很複雜,穩定性也得不到保證.
另外一個角度是為了讓程序複用,提高生産效率.也就是說,如果不關注業務邏輯,隻注重接收數據,那麼服務器程序可以給任何一個開發者使用.換句話說,我們不用從頭開始寫.直接使用現有的高性能的服務器就可以滿足需求了.例如公司白領中午要吃飯,不可能跑回家自己去做飯吃,自己叫外賣就好了.
但是現實問題仍然沒有解決,通過什麼方式去處理業務邏輯呢?
你要給手機充電時,把插頭插入插線闆就能獲取電了.插線闆有接口,提供了電.
同理服務器程序最好也提供接口,浏覽器通過統一的接口給服務器,然後我們從服務器接口中獲取我們想要的數據.獲取數據之後我們可以把數據交給第三方程序來處理邏輯,這樣就做到與服務器業務分離了,good iead.
【文章福利】小編整理了一些學習資料、教學視頻和學習路線圖共享在群文件,資料包括《Andoird音視頻開發必備手冊 音視頻最新學習視頻 大廠面試真題 2022最新學習路線圖 項目實戰源碼》等等(C/C ,Linux,FFmpeg ,webRTC, rtmp, hls, rtsp, ffplay, srs),免費分享,有需要的可以搜索788280672加群自取~希望對大家有幫助!
事實上,現在的http服務器就是這麼做的,不過很複雜而已.下一篇開始為您介紹這些接口.
附錄:HTTP Request Header 請求頭
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!