目錄
一、HTTP是應用層協議
二、HTTP服務器
三、HTTP服務
認識請求中的uri
HTTP支持默認首頁
響應?
功能完善
套接字復用
一、HTTP是應用層協議
HTTP下層是TCP協議,站在TCP的角度看,要提供的服務是HTTP服務。
這是在原來實現網絡版計算器時,實現的TCPServer.hpp,在TCP上層是HttpServer時,為了方便代碼閱讀,修改上層服務的命名為http_server。
對于HTTP服務,接收一次請求字符串,做出一次響應。?
在TCP處理服務時,每個線程要做的內容。
?
為什么要這樣處理,不同于網絡版計算器。
1.由于TCP面向字節流,不管上層是什么服務(協議),都可能會出現讀取到一個不完整請求的情況(黏包問題),所以,在網絡版計算器實現時,添加了對協議的解析過程,比如內容長度、\r\n的分割等內容,標識可以有效的幫助我們對收到的請求做處理,確保至少有一個完整的請求。
2.對于HTTP,其實有較大的概率,能得到一個完整的請求,因此,不再添加對HTTP的黏包處理過程。
二、HTTP服務器
簡單的搭建一個HTTP服務器,用Windows瀏覽器訪問,查看HTTP請求格式。
我們可以簡單的把HTTP的請求在服務器端直接打印出來。
接下來開始正式完成Http主體內容。
我們手寫的HTTP服務的主要任務是序列化和反序列化這個過程。因此,如何保證HTTP要服務的字符串是一個完整的請求,并不詳細的再去用代碼實現。
三、HTTP服務
- 一個HTTP服務中,有HTTP請求和HTTP響應。
- 由一個完整的string轉化為類成員變量,即結構化數據,這個過程就是反序列化。
- 智能指針管理資源——RAII
- ?可以輕松的得到請求行。
- 對應請求頭和請求內容,相對復雜。?
- 進一步反序列化,獲取更加詳細的信息?
- 解析請求行?
- 解析請求頭
在Print函數中添加解析后打印的代碼
認識請求中的uri
請求中沒有指明某一個服務器資源時,請求的默認就是 /
HTTP支持默認首頁
請求/ 并不表示請求服務器的根目錄,這個根目錄表示的是Web根目錄。
- 一般在實現服務器的同路徑下,有一個保存客戶端請求資源的目錄,叫做wwwroot,即Web根目錄,請求/,即表示請求wwwroot。
- HTTP支持默認首頁,所以每一個資源目錄下都有index.html。
基于以上兩點,請求/本質是請求HTTP服務下的 ./wwwroot/index.html。
- 修改代碼
?
- 拼接首頁?
?
- 實際資源與url解耦合,我們可以自己定義path?
響應?
- Linux支持telnet,可以自己構建完整請求。?
- 服務器的工作是收到序列化的請求,把他反序列化后解析,按照請求構造一個序列化的響應?
因此,我們所寫HTTP服務響應只有序列化的功能。
- ?詳細字段
- ? 序列化函數
- ?整理一個資源
- Content-Type映射表
?
?
?
功能完善
-
套接字復用
?