【Linux C/C++】 第09讲 HTTP协议与浏览器显示网页

来源:互联网 发布:淘宝买东西寄到英国 编辑:程序博客网 时间:2024/05/16 18:49

   实现多线程文件传输之后,就可以尝试去实现浏览器显示自定义网页

      因为浏览器访问服务器端的网页是根据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;

}

      
原创粉丝点击