实现多线程文件传输之后,就可以尝试去实现浏览器显示自定义网页
因为浏览器访问服务器端的网页是根据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协议实现
然后按回车键发出请求
服务器的公网地址: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
程序实现:
constchar* domain_name ="www.baidu.com";
host = gethostbyname(domain_name);
intlen=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文件,读取并发送
//此处略去了文件的打开和读取,读者自行参考之前的文章
intloc =0;
while(length >0)
{
//printf("loc:%d\n",loc);
intlen = length >1024?1024: length;
buffer = (char*)malloc(len);
memcpy(buffer,&buffer_html[loc],len);
send(fd,buffer,len);
length -= len;
loc += len;
}