网络基础 2-1(应用层,HTTP三点注意,HTTP协议格式, 最简单的HTTP服务器)
應(yīng)用層
應(yīng)用層
負(fù)責(zé)應(yīng)用程序之間的數(shù)據(jù)溝通-----協(xié)議都是用戶自己定的
自定制協(xié)議:
結(jié)構(gòu)化數(shù)據(jù)傳輸
序列化:
將數(shù)據(jù)對象以指定的協(xié)議(數(shù)據(jù)格式)進行可用于持久化存儲或者數(shù)據(jù)傳輸時的數(shù)據(jù)組織
例如在分布式的系統(tǒng)中,需要把對象從網(wǎng)絡(luò)的一端傳輸?shù)搅硗庖欢?#xff1b;而網(wǎng)絡(luò)中數(shù)據(jù)是以二進制流的方式來傳遞的 ;此時對象的序列化就是完成把對象轉(zhuǎn)化成對應(yīng)二進制流的方式;反序列化則是把二進制流轉(zhuǎn)化為對象數(shù)據(jù)的方式。
反序列化:
將二進制數(shù)據(jù)串按照指定的協(xié)議進行解析獲取到各個數(shù)據(jù)對象
序列化的方式:
知名協(xié)議
HTTP-----超文本傳輸協(xié)議
URL:統(tǒng)一資源定位符(網(wǎng)址)
URL格式:
協(xié)議名稱://用戶名:密碼@服務(wù)器地址:端口/資源路徑?查詢字符串#片段標(biāo)識符查詢字符串(用戶提交的數(shù)據(jù))中若包含特殊字符則需要進行URL編碼,因為在URL中特殊字符具有特殊含義。用戶提交的數(shù)據(jù)中若有特殊字符要避免這種二義性
urlencode:將特殊字符每一個字節(jié)轉(zhuǎn)換成為16進制數(shù)字的字符串,并且在前邊加上%
urldecode:%2 -('2'-'0')<<4+b-'0'
HTTP協(xié)議
HTTP三點注意事項
HTTP協(xié)議格式
1.首行:
以空格進行間隔,分了三個部分
1-1請求首行:
請求方法
HTTP1.0定義了三種請求方法:GET: 獲取資源,提交數(shù)據(jù)在URL中存放,沒有正,POST:傳輸實體主體,提交數(shù)據(jù)在正文中出現(xiàn),有正文,HEAD(獲得報文頭部,文件有多長)等其他方法。
協(xié)議版本
0.9/1.0/1.1/1.2-------各個版本之間的新特性
1-2響應(yīng)首行
常見的狀態(tài)碼, 比如 200(OK), 404(Not Found), 403(Forbidden,認(rèn)證失敗), 302(Redirect, 重定向), 502(Bad Gateway,壞的網(wǎng)關(guān))
2. 頭部
都是一個個以冒號空格形式組成的鍵值對,這些鍵值對之間以\r\n進行間隔
Conter-Length(標(biāo)志正文有多長,解決粘包問題)/Content-Type(正文類型)/Referer(跳轉(zhuǎn)位置)/Cookie/Set-Cookie/Location(重定向位置)/Transfer-Encoding(是否進行分塊傳輸)
HTTP響應(yīng)頭消息
3. 空行
\r\n間隔頭部與正文
4. 正文
http協(xié)議是一個在傳輸層基于tcp協(xié)議實現(xiàn)的應(yīng)用層協(xié)議,在傳輸層默認(rèn)使用80端口,使用字符串明文傳輸
HTTP 協(xié)議的 8 種請求類型介紹
HTTP 協(xié)議中共定義了八種方法或者叫“動作”來表明對 Request-URI 指定的資源的不同操作方式,具體介紹如下:
雖然 HTTP 的請求方式有 8 種,但是我們在實際應(yīng)用中常用的也就是 get 和 post,其他請求方式也都可以通過這兩種方式間接的來實現(xiàn)。
最簡單的HTTP服務(wù)器
/* *實現(xiàn)最簡單的http服務(wù)器1.http實際是一個tcp服務(wù)器,不過應(yīng)用數(shù)據(jù)的處理是http協(xié)議格式2.處理數(shù)據(jù)的時候:1. 獲取http頭部(首行+頭部)2.獲取數(shù)據(jù)3.根據(jù)頭部中的請求處理數(shù)據(jù)3.接受到瀏覽器的請求之后,打印一下請求的數(shù)據(jù),并且響應(yīng)<html><body><h1>Hello World</h1></body></html>*/ #include<sstream> #include"tcpsocket.hpp" int main() {TcpSocket sock;CHECK_RET(sock.Socket());CHECK_RET(sock.Bind("0.0.0.0",2502));CHECK_RET(sock.Listen());while(1){TcpSocket clisock;std::string cliip;uint16_t cliport;bool ret =sock.Accept(clisock,cliip,cliport);if(ret == false){continue;}std::string buf;clisock.Recv(buf);std::cout<<"req:["<<buf<<"]\n";std::string body;body = "<html><body><h1>Hello World</h1></body></html>";//正文std::string first_line = "HTTP/1.1 200 OK \r\n";//頭部std::stringstream header;header << "Content-Length:" << body.size() << "\r\n";//正文長度header << "Content-Type:" << "text/html\r\n";//正文類型std::string blank ="\r\n";//空行clisock.Send(first_line);clisock.Send(header.str());clisock.Send(blank);clisock.Send(body);clisock.Send(body);clisock.Close();}return 0; }總結(jié)
以上是生活随笔為你收集整理的网络基础 2-1(应用层,HTTP三点注意,HTTP协议格式, 最简单的HTTP服务器)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 光环无限多少钱
- 下一篇: 网络基础2-2(传输层,端口,详谈UDP