1. 程式人生 > >【Linux C/C++】 第09講 HTTP協議與瀏覽器顯示網頁

【Linux C/C++】 第09講 HTTP協議與瀏覽器顯示網頁

   實現多執行緒檔案傳輸之後,就可以嘗試去實現瀏覽器顯示自定義網頁

      因為瀏覽器訪問伺服器端的網頁是根據HTTP/HTTPS協議

        這需要先去了解HTTP/HTTPS協議

        實際上就是一種資料格式,資料包傳送和接收的格式

        瀏覽器會自動進行格式排列發出,自動解析收到的資料包進行顯示

   一、HTTP協議    

      1.1 URL

          URL的全稱是Uniform Resource Locator (統一資源定位符)

          通過1個URL,能夠找到網際網路上唯一的1個資源

          URL就是資源的地址、位置,網際網路上的每個資源都有唯一的URL

          URL的基本格式:協議://主機地址/路徑

                         

http://119.23.71.163:18888/Tomo.html 

       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;

}