【Linux C/C++】 第09講 HTTP協議與瀏覽器顯示網頁
實現多執行緒檔案傳輸之後,就可以嘗試去實現瀏覽器顯示自定義網頁
因為瀏覽器訪問伺服器端的網頁是根據HTTP/HTTPS協議的
這需要先去了解HTTP/HTTPS協議
實際上就是一種資料格式,資料包傳送和接收的格式
瀏覽器會自動進行格式排列發出,自動解析收到的資料包進行顯示
一、HTTP協議
1.1 URL
URL的全稱是Uniform Resource Locator (統一資源定位符)
通過1個URL,能夠找到網際網路上唯一的1個資源
URL就是資源的地址、位置,網際網路上的每個資源都有唯一的URL
URL的基本格式:協議://主機地址/路徑
1.2 協議
HTTP協議 -超文字傳輸協議,訪問的是遠端的網路資源,最常用
file協議 -訪問的是本地計算機上的資源
mailto協議 -訪問的是電子郵件的地址
FTP協議 -訪問的是共享主機的檔案資源
1.3 HTTP簡介
規定客戶端和伺服器傳輸資料的格式
完整的http通訊可以分為2大步驟:
1> 請求: 客戶端向伺服器索要資料
2> 響應: 伺服器返回客戶端相應的資料
傳送http請求的方法,在http/1.1協議中,定義了8種
GET、POST、OPTIONS、HEAD、PUT、
DELETE、TRACE、CONNECT、PATCH
常用的只有GET和POST
二、HTTP協議實現
在瀏覽器位址列輸入:http://119.23.71.163:18888/Tomo.html ,
然後按回車鍵發出請求
伺服器的公網地址:119.23.71.163
埠:18888
請求顯示的頁面:Tomo.html
發出的請求資料包是按照一個特定格式排列的
瀏覽器會自動組包,併發給伺服器
一個http請求報文由
請求行(request line)、請求頭部(header)、空行和請求資料
4個部分組成,具體格式如下:
GET /Tomo.html HTTP/1.1
Host: 119.23.71.163:18888
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn
Connection: keep-alive
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/601.7.7 (KHTML, like Gecko) Version/9.1.2 Safari/601.7.7
程式實現:
const char* domain_name = "www.baidu.com";
host = gethostbyname(domain_name);
int len=0;
sprintf(buf_get,"GET %s HTTP/1.1\r\n",path);
len = strlen(buf_get);
sprintf(&buf_get[len],"%s","Accept: */*\r\n");
len = strlen(buf_get);
sprintf(&buf_get[len],"Host: %s\r\n",domain_name);
len = strlen(buf_get);
sprintf(&buf_get[len],"%s","Connection: keep-alive\r\n\r\n");
len = strlen(buf_get);
send(fd,buf_get,len);
伺服器端收到請求資料包之後,需要自己按照格式編寫
應該給瀏覽器傳送指定的網頁響應資料包
然後瀏覽器進行自動解析並顯示
響應資料包格式,響應報文由4個部分組成:
狀態行、響應頭部、空行和響應包體
HTTP/1.1 200 OK
Server:skynet
Content-Type:text/html;charset=utf-8
Content-Length:948
Connection:keep-alive
程式實現:
sprintf(buffer,"%s","HTTP/1.1 200 OK\r\n");
size = strlen(buffer);
sprintf(&buffer[size],"%s","Server:skynet\r\n");
size = strlen(buffer);
sprintf(&buffer[size],"Content-Type:%s%s\r\n",content_type,charset);
size = strlen(buffer);
sprintf(&buffer[size],"%s%d\r\n","Content-Length:",length);
size = strlen(buffer);
sprintf(&buffer[size],"%s","Connection:keep-alive\r\n\r\n");
size = strlen(buffer);
//data - 開啟伺服器上的html檔案,讀取併發送
//此處略去了檔案的開啟和讀取,讀者自行參考之前的文章
int loc =0;
while(length >0)
{
// printf("loc:%d\n",loc);
int len = length >1024 ? 1024 : length;
buffer = (char*)malloc(len);
memcpy(buffer,&buffer_html[loc],len);
send(fd,buffer,len);
length -= len;
loc += len;
}