中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

全球十大互聯(lián)網(wǎng)公司排行榜seo優(yōu)化網(wǎng)站源碼

全球十大互聯(lián)網(wǎng)公司排行榜,seo優(yōu)化網(wǎng)站源碼,wordpress全站開啟ssl,深汕特別合作區(qū)面積一、HTTP協(xié)議簡單介紹 1.1 什么是HTTP協(xié)議 HTTP(超文本傳輸協(xié)議)是一種用于在Web瀏覽器和Web服務(wù)器之間傳輸數(shù)據(jù)的應(yīng)用層協(xié)議。它是一種無狀態(tài)協(xié)議,即服務(wù)器不會保留與客戶端的任何連接狀態(tài)信息,每個請求都被視為一個獨立的事務(wù)?!?article class="baidu_pl">

一、HTTP協(xié)議簡單介紹

1.1 什么是HTTP協(xié)議

HTTP(超文本傳輸協(xié)議)是一種用于在Web瀏覽器和Web服務(wù)器之間傳輸數(shù)據(jù)的應(yīng)用層協(xié)議。它是一種無狀態(tài)協(xié)議,即服務(wù)器不會保留與客戶端的任何連接狀態(tài)信息,每個請求都被視為一個獨立的事務(wù)。

假設(shè)你使用Web瀏覽器(例如Chrome)訪問一個網(wǎng)頁。當(dāng)你在瀏覽器中輸入網(wǎng)址并按下"Enter"鍵時,瀏覽器會向服務(wù)器發(fā)送一個HTTP請求。你也可以理解為HTTP協(xié)議是在客戶端(瀏覽器)和服務(wù)器之間傳輸數(shù)據(jù)的基礎(chǔ)(約定)。

1.2 再次理解協(xié)議

協(xié)議是指在通信過程中,參與方之間所達成的一種約定或規(guī)范。在網(wǎng)絡(luò)通信中,協(xié)議是用來定義數(shù)據(jù)傳輸規(guī)則和通信方式的一組規(guī)范。

具體來說,基于HTTP協(xié)議,它定義了客戶端(例如Web瀏覽器)和服務(wù)器之間進行通信時所需遵循的規(guī)范。

??HTTP協(xié)議主要包含以下幾個方面的規(guī)定

  1. 請求方式:HTTP協(xié)議定義了一系列的請求方法,如GET、POST、PUT、DELETE等,用于告知服務(wù)器進行何種操作。

  2. 請求和響應(yīng)格式:HTTP協(xié)議規(guī)定了請求消息和響應(yīng)消息的格式。請求消息由請求行、請求頭部和請求正文組成,而響應(yīng)消息由狀態(tài)行、響應(yīng)頭部和響應(yīng)正文組成。

  3. 狀態(tài)碼:HTTP協(xié)議定義了一系列的狀態(tài)碼,用于表示服務(wù)器對請求的處理結(jié)果。例如,200表示成功、404表示資源未找到、500表示服務(wù)器內(nèi)部錯誤等。

  4. 頭部信息:HTTP協(xié)議通過頭部字段來攜帶各種元數(shù)據(jù),例如Content-Type用于指示請求或響應(yīng)的數(shù)據(jù)類型,Content-Length表示消息正文的長度等。

  5. 連接管理:HTTP協(xié)議還定義了一些機制用于管理連接,如持久連接(keep-alive)允許多個請求和響應(yīng)復(fù)用同一個TCP連接,以減少連接建立的開銷。

二、HTTP請求

2.1 HTTP的工作過程

我們不妨先來了解一下HTTP的工作過程當(dāng)你在瀏覽器中輸入一個網(wǎng)址并按下"Enter"鍵時,瀏覽器就會向服務(wù)器發(fā)送一個HTTP請求。請求時,瀏覽器會給服務(wù)器發(fā)送請求報文。當(dāng)服務(wù)器收到請求后,它會根據(jù)請求報文進行相應(yīng)的處理,并生成一個HTTP響應(yīng)(響應(yīng)報文)返回給瀏覽器。一個請求再加一個回應(yīng),就完成了客戶端與服務(wù)器的數(shù)據(jù)傳輸與交互。

上述講述的都是概念。下面我們結(jié)合一段代碼來理解。在看代碼之前,強調(diào)一下HTTP 是一種應(yīng)用層協(xié)議,是基于?TCP/IP 通信協(xié)議來傳遞數(shù)據(jù)的。具體也可看下圖:

demo代碼

首先我們需要基于套接字實現(xiàn)一個服務(wù)端HttpServer.hpp:

#include <iostream>
#include <signal.h>
#include "Sock.hpp"class HttpServer
{
public:using func_t = std::function<void(int)>;private:Sock _serverSock;int _sock;std::string _ip;uint16_t _port;func_t _func;public:HttpServer(uint16_t port, func_t func, std::string ip = "0.0.0.0"):_port(port),_func(func),_ip(ip){_sock = _serverSock.Socket();_serverSock.Bind(_sock, _port, _ip);_serverSock.Listen(_sock);}void start(){signal(SIGCHLD, SIG_IGN);while(true){std::string clientIP;uint16_t clientPort = 0;int sockfd = _serverSock.Accept(_sock, &clientIP, &clientPort);if(sockfd < 0)continue;if(fork() == 0){close(_sock);_func(sockfd);close(sockfd);exit(0);}close(sockfd);}}~HttpServer(){if(_sock >= 0) close(_sock);}
};

下面是對套接字操作的封裝代碼Sock.hpp:


#pragma once#include <iostream>
#include <string>
#include <cstring>
#include <cerrno>
#include <cassert>
#include <unistd.h>
#include <memory>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <ctype.h>
#include "LogTest.hpp"class Sock
{
private:const static int gbacklog = 20;public:Sock() {}int Socket(){int listensock = socket(AF_INET, SOCK_STREAM, 0);if (listensock < 0){LogMessage(FATAL, "create socket error, %d:%s", errno, strerror(errno));exit(2);}LogMessage(NORMAL, "create socket success, listensock: %d", listensock);return listensock;}void Bind(int sock, uint16_t port, std::string ip = "0.0.0.0"){struct sockaddr_in local;memset(&local, 0, sizeof local);local.sin_family = AF_INET;local.sin_port = htons(port);inet_pton(AF_INET, ip.c_str(), &local.sin_addr);if (bind(sock, (struct sockaddr *)&local, sizeof(local)) < 0){LogMessage(FATAL, "bind error, %d:%s", errno, strerror(errno));exit(3);}}void Listen(int sock){if (listen(sock, gbacklog) < 0){LogMessage(FATAL, "listen error, %d:%s", errno, strerror(errno));exit(4);}LogMessage(NORMAL, "init server success");}// 一般經(jīng)驗// const std::string &: 輸入型參數(shù)// std::string *: 輸出型參數(shù)// std::string &: 輸入輸出型參數(shù)int Accept(int listensock, std::string *ip, uint16_t *port){struct sockaddr_in src;socklen_t len = sizeof(src);int servicesock = accept(listensock, (struct sockaddr *)&src, &len);if (servicesock < 0){LogMessage(ERROR, "accept error, %d:%s", errno, strerror(errno));return -1;}if(port) *port = ntohs(src.sin_port);if(ip) *ip = inet_ntoa(src.sin_addr);return servicesock;}bool Connect(int sock, const std::string &server_ip, const uint16_t &server_port){struct sockaddr_in server;memset(&server, 0, sizeof(server));server.sin_family = AF_INET;server.sin_port = htons(server_port);server.sin_addr.s_addr = inet_addr(server_ip.c_str());if(connect(sock, (struct sockaddr*)&server, sizeof(server)) == 0) return true;else return false;}~Sock() {}
};

下面我們要做的就是啟動服務(wù)器,然后用Web瀏覽器訪問我們所啟動的服務(wù)器,這時候是瀏覽器向我們所寫的服務(wù)器發(fā)送請求。根據(jù)上述HTTP協(xié)議的工作過程,這時候會像服務(wù)器發(fā)送一個請求報文。我們啟動服務(wù)器HTTPServer.cc:

#include <iostream>
#include <memory>
#include <vector>
#include <fstream>#include "Util.hpp"
#include "HttpServer.hpp"void Usage(std::string name)
{std::cout << "\nUsage :" << name << " Port\n" << std::endl;
}void HandlerHttpRequest(int sockfd)
{// 1. 讀取請求 for testchar buffer[10240];ssize_t s = recv(sockfd, buffer, sizeof(buffer) - 1, 0);if (s > 0){buffer[s] = 0;std::cout << buffer << "--------------------\n" << std::endl;}}int main(int argc, char* argv[])
{if(argc != 2){Usage(argv[0]);exit(0);}std::unique_ptr<HttpServer> httpServer(new HttpServer(atoi(argv[1]),                 HandlerHttpRequest));httpServer->start();return 0;
}

運行結(jié)果:

我們看到確實我們所寫的服務(wù)器發(fā)送了一些信息。該信息就是請求報文。但發(fā)現(xiàn)無法打開此頁面,是因為我們并沒有向瀏覽器發(fā)送任何響應(yīng)數(shù)據(jù)。接下來我們詳細了解一下HTTP的請求。

2.2 URL介紹

?URL(Uniform Resource Locator)是用于標(biāo)識和定位互聯(lián)網(wǎng)上資源的字符串。URL由多個組件構(gòu)成,包括協(xié)議、域名(或IP地址)、端口號、路徑和查詢參數(shù)等。

下面是一個示例URL:http://www.example.com:8080/path/to/resource?param1=value1&param2=value2

解釋:

  • 協(xié)議:URL的第一部分是協(xié)議,這里是"http"。協(xié)議指定了瀏覽器與服務(wù)器之間的通信規(guī)則,常見的有HTTP和HTTPS。
  • 域名(或IP地址):在示例中,域名是"www.example.com"。域名是用于標(biāo)識互聯(lián)網(wǎng)上特定站點的字符串,也可以使用IP地址來代替。
  • 端口號:示例中的端口號是"8080"。默認情況下,HTTP使用80端口,HTTPS使用443端口,但可以使用不同的端口號來訪問特定的服務(wù)。
  • 路徑:路徑指定了在服務(wù)器上資源的位置,示例中是"/path/to/resource"。路徑可以是文件、目錄或其他資源的位置。
  • 查詢參數(shù):在示例中,查詢參數(shù)是"?param1=value1&param2=value2"。查詢參數(shù)用于向服務(wù)器傳遞額外的信息,以便執(zhí)行特定的操作或獲取特定的結(jié)果。

平時我們俗稱的 "網(wǎng)址" ,其實就是說的 URL。?具體也可看下圖:

域名就是服務(wù)器地址。瀏覽器會對域名進行解析,解析后就會轉(zhuǎn)換為對應(yīng)的地址。一個服務(wù)器地址,再加上端口號,這就標(biāo)示了該服務(wù)器的唯一進程。端口號后面用? ‘ / ’ 分隔的就是我們所請求資源在該服務(wù)器上的路徑。

2.3?HTTP 請求格式

服務(wù)器收到一個HTTP請求后,請求格式如下:

  1. 請求行:瀏覽器發(fā)送的第一部分是請求行,它包含了請求的方法(例如GET)、要訪問的資源路徑(例如/index.html)以及使用的HTTP版本(例如HTTP/1.1)。

  2. 請求頭部:接下來,瀏覽器發(fā)送請求頭部,其中包含一些額外的信息,例如瀏覽器類型、所支持的編碼方式、語言首選項等。

  3. 空行:請求頭部之后是一個空行,用于分隔請求頭部和請求正文。

  4. 請求正文(可選):有些請求可能包含請求正文,例如表單數(shù)據(jù)或上傳的文件。

其實我們對照我們剛剛舉例的運行結(jié)果,也可總結(jié)出請求報文的格式,具體如下圖:

當(dāng)服務(wù)器拿到請求報文后,會對請求報文進行分析。例如,其中就包含了請求的方法(例如GET)、請求的資源路徑和協(xié)議版本,結(jié)合請求報頭就會對此進行分析,找到資源并形成響應(yīng)報文進行返回。其中有許多細節(jié)并未解釋,后文會詳細解釋。下面我們先來看一下響應(yīng)報文的格式。

三、HTTP響應(yīng)

上述我們例子中并未看到有任何界面。原因就是在于Web瀏覽器并未收到任何響應(yīng)。根本在于我們所寫的服務(wù)器就沒有對此進行響應(yīng)。我們不妨先看一下響應(yīng)的實例。

3.1 響應(yīng)demo

HttpServer.cc:

// 一般http都要有自己的web根目錄
#define ROOT "./wwwroot" // ./wwwroot/index.html
// 如果客戶端只請求了一個/,我們返回默認首頁
#define HOMEPAGE "index.html"void Usage(std::string name)
{std::cout << "\nUsage :" << name << " Port\n"<< std::endl;
}void HandlerHttpRequest(int sockfd)
{// 1. 讀取請求 for testchar buffer[10240];ssize_t s = recv(sockfd, buffer, sizeof(buffer) - 1, 0);if (s > 0){buffer[s] = 0;// std::cout << buffer << "--------------------\n" << std::endl;}std::vector<std::string> vline;Util::cutString(buffer, "\n", &vline);std::vector<std::string> vblock;Util::cutString(vline[0], " ", &vblock);std::string file = vblock[1];std::string target = ROOT;if (file == "/")file = "/index.html";target += file;std::cout << target << std::endl;std::string content;std::ifstream in(target);if (in.is_open()){std::string line;while (std::getline(in, line)){content += line;}in.close();}std::string HttpResponse;if (content.empty())HttpResponse = "HTTP/1.1 404 NotFound\r\n";elseHttpResponse = "HTTP/1.1 200 OK\r\n";HttpResponse += "\r\n";HttpResponse += content;// 2. 試著構(gòu)建一個http的響應(yīng)send(sockfd, HttpResponse.c_str(), HttpResponse.size(), 0);
}int main(int argc, char *argv[])
{if (argc != 2){Usage(argv[0]);exit(0);}std::unique_ptr<HttpServer> httpServer(new HttpServer(atoi(argv[1]), HandlerHttpRequest));httpServer->start();return 0;
}

這里有一個細節(jié):當(dāng)我們輸入URL沒有請求資源路徑時,瀏覽器會自動加上一個 ’ / ‘,代表著根目錄。這里的根目錄與Liunx 的根目錄是不同的。一般服務(wù)器都會設(shè)置默認的Web根目錄。這時候就是訪問的默認界面。

index.html:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>HTTP響應(yīng)</title>
</head><body><h3>現(xiàn)在你能夠看到我了</h3><p>我是一個Linux的學(xué)習(xí)者,我正在進行http的測試工作!!</p><p>我是一個Linux的學(xué)習(xí)者,我正在進行http的測試工作!!</p><p>我是一個Linux的學(xué)習(xí)者,我正在進行http的測試工作!!</p><p>我是一個Linux的學(xué)習(xí)者,我正在進行http的測試工作!!</p><p>我是一個Linux的學(xué)習(xí)者,我正在進行http的測試工作!!</p><p>我是一個Linux的學(xué)習(xí)者,我正在進行http的測試工作!!</p><p>我是一個Linux的學(xué)習(xí)者,我正在進行http的測試工作!!</p>
</body>
</html>

運行結(jié)果:

確實有了界面,也正是我們所設(shè)計的界面。通過HTTP,客戶端可以獲取到Web服務(wù)器上的各種資源,例如HTML文檔、圖像、視頻、樣式表等。

3.2?HTTP響應(yīng)格式

當(dāng)服務(wù)器收到請求后,它會進行相應(yīng)的處理,并生成一個HTTP響應(yīng)返回給瀏覽器。

  1. 響應(yīng)狀態(tài)行:響應(yīng)的第一部分是狀態(tài)行,它包含了響應(yīng)的HTTP版本(例如HTTP/1.1)、響應(yīng)狀態(tài)碼(例如200表示成功)以及對應(yīng)的狀態(tài)消息(例如"OK")。

  2. 響應(yīng)頭部:接下來,服務(wù)器發(fā)送響應(yīng)頭部,其中包含一些額外的信息,例如服務(wù)器類型、響應(yīng)時間、返回的數(shù)據(jù)類型等。

  3. 空行:響應(yīng)頭部之后是一個空行,用于分隔響應(yīng)頭部和響應(yīng)正文。

  4. 響應(yīng)正文:響應(yīng)正文包含了服務(wù)器返回的實際數(shù)據(jù),例如HTML頁面、圖像、CSS樣式表等。

具體也可結(jié)合下圖理解:

http://www.risenshineclean.com/news/27621.html

相關(guān)文章:

  • 網(wǎng)站icp備案電商培訓(xùn)心得體會
  • 有一個做名片的網(wǎng)站提高網(wǎng)站排名軟件
  • 中山網(wǎng)站制作費用百度熱詞指數(shù)
  • 郵箱域名可以做網(wǎng)站嗎企業(yè)網(wǎng)站建設(shè)方案策劃書
  • wordpress添加頁面的代碼河北網(wǎng)站seo地址
  • 網(wǎng)絡(luò)廣告案例以及分析智能優(yōu)化網(wǎng)站
  • 做一個網(wǎng)站需要多少時間常見的網(wǎng)絡(luò)營銷策略都有哪些
  • 保潔公司在哪個網(wǎng)站做推廣比較好點擊排名優(yōu)化
  • 在家做十字繡兼職網(wǎng)站今日國際新聞最新消息
  • 如皋做網(wǎng)站公司品牌網(wǎng)絡(luò)營銷策劃書
  • 建設(shè)日本網(wǎng)站首頁seo優(yōu)化收費
  • 怎么用dw做靜態(tài)網(wǎng)站如何做企業(yè)網(wǎng)頁
  • 宿州網(wǎng)站建設(shè)時間seo基礎(chǔ)教程視頻
  • app應(yīng)用程序百度小程序關(guān)鍵詞優(yōu)化
  • 網(wǎng)站建站網(wǎng)站299266co提升關(guān)鍵詞
  • 有高并發(fā) 高訪問量網(wǎng)站開發(fā)百度seo招聘
  • 怎么做企業(yè)網(wǎng)站推廣南京seo整站優(yōu)化技術(shù)
  • 本地服務(wù)器怎么做網(wǎng)站站長之家關(guān)鍵詞挖掘
  • 網(wǎng)站建設(shè)一般要多少費用網(wǎng)絡(luò)營銷的含義
  • 購物網(wǎng)站后臺好管理嗎百度seo原理
  • 代駕app軟件開發(fā)公司seo推廣怎么做
  • 個性化定制網(wǎng)站的特點一站式自媒體服務(wù)平臺
  • 做電子商務(wù)網(wǎng)站需要學(xué)什么2024年3月新冠高峰
  • 企業(yè)網(wǎng)站建設(shè)的必要性百度收錄比較好的網(wǎng)站
  • aspaccess做網(wǎng)站站長平臺百度
  • 煙臺快速建站有哪些公司低價刷粉網(wǎng)站推廣
  • 做網(wǎng)站一個月能掙多少香港seo公司
  • 西安網(wǎng)站建設(shè)設(shè)計專業(yè)公司網(wǎng)絡(luò)推廣
  • vs210做網(wǎng)站什么是網(wǎng)絡(luò)營銷公司
  • 網(wǎng)站推廣目標(biāo)是什么seo整站排名