http协议简单实现使用ip访问html网页的demo
http协议
- URL
- http协议格式
- http请求
- 请求响应
- 请求方法
- 总结
- 简单的http服务器
- 前期准备
- 程序代码
- 运行结果
http协议又称为
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。
HTTP是万维网的数据通信的基础
URL
统一资源定位系统(uniform resource locator;URL)是因特网的万维网服务程序上用于指定信息位置的表示方法
每一个资源都一个统一的且在网上唯一的地址,这个地址就叫URL。他是同一资源定位标志,也叫做网络地址
- 语法格式
[协议名称]//<用户名>:<密码>@<主机>:<端口>/
其中用户名和密码是可以省略的,防止不安全事情发生

http://,协议方案名user:passward@,用户名和密码,一般隐藏或者省略www.baidu.com,域名,也可以换成服务器的ip地址80,服务器的侦听端口/dir/XXX.html,浏览器需要请求资源的路径,/不是linux操作系统中的根目录,而是http服务器定义的逻辑上的根目录id=1&wd=C%2B%2B,查询字符串,是浏览器给http服务器提交的数据。- 片段标识符,表示当前页面被浏览器加载之后,所定位到的位置
在查询字符串中,所提交的单个数据是按照key=value的形式来存放,多个数据的中间使用&进行分隔
对于提交的数据,需要对他们进行区分,防止造成歧义。就像+和C++中的+号,在不同的情况下会有着不同的意义,防止这种情况,就需要在传输字符的时候进行url编码
- 编码的方式就是将特殊的字符按照16进制进行传输
+ --> 2B - 同时为了区别编码后的字符,所以在每个字符前加上
%来分隔
对于服务器而言,在接收到url编码之后的查询字符串,需要先对字符串进行url解码

http协议格式
http请求
- 请求首行
[请求方法] + [url] + [版本] + \r\n
- 请求头部
具有多行数据,每行数据的格式都是key:value的形式,每行数据使用\r\n分离。(回车加换行)

Content - Length,正文的长度,防止发生tcp的粘包问题Content - Type,正文的编码格式
text/html:HTML格式
text/plain:纯文本格式
text/png:png图片的格式
application/json:json数据格式
application/msword:word文档格式
referer,表示当前页面是从哪一个页面跳转过来的Cookie,向服务器提交浏览器本地保存的认证信息,认证信息是之前服务器登录的时候,服务器返回回来的Tranfer-Encoding,针对正文而言,可以支持分块传输Loaction,和3XX重定向搭配使用,http服务器会告诉浏览器,先前请求的页面应该去哪一个地址上重新申请User-Agent,生命操作系统和浏览器版本信息Connection,keep-alive保持长连接
- \r\n
请求响应
- 响应首行
[协议版本] + [状态码] + [状态码解释] + \r\n
状态码:
1XX,接收到请求正在处理
100 Continue
服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。
101 Switching Protocols
服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。
2XX,请求正常处理完毕
200 OK
请求成功(其后是对GET和POST请求的应答文档。)

3XX,重定向状态,表示浏览器需要进行附加操作,才可以完成刚才的请求操作
302 临时重定向
所请求的页面已经临时转移至新的url。
4XX,服务器无法处理当前请求
404 Page Not Fount
服务器无法找到被请求的页面。
5XX,服务器处理出错
502 Bad Gateway
请求未完成。服务器从上游服务器收到一个无效的响应。
- 响应头部
响应头部中有着多行数据,每行数据都是key:value的形式,行与行之间使用\r\n来分隔
响应头部字段和请求头部字段差不多
- \r\n
请求方法
GET,从服务器获取资源的方法
GET并不是只能向服务器获取资源,也可以在查询字符串中提交数据到浏览器
GET请求提交的数据都在URL当中
POST,向服务器提交数据的方法
POST提交的数据在正文当中
区别:
POST方法比GET方法更加私密,POST方法有一个加密操作
总结
- http协议是应用层的协议,在传输层使用tcp协议,网络层使用ip协议
- http协议的本身是为了处理大量的请求,一开始在传输层使用tcp连接为短连接,现在已经支持长连接
- http是没有加密版本的http协议,加密版本可以使用https,s表示ssl(非对称加密)
简单的http服务器
前期准备
- 查看防火墙状态
sudo systemctl status firewalld
- 启动防火墙
sudo firewall-cmd --state
- 开启http的80端口,与需要使用连接的端口
sudo firewall-cmd --add-port=19999/tcp --permanent
sudo firewall-cmd --add-port=80/tcp --permanent
- 重启防火墙
sudo firewall-cmd --reload
如果是使用虚拟机中的系统进行连接的时候,不能使用桥接模式,应该使用NET模式。因为桥接模式是没有ip的
桥接是在两个网络(WDS是指的无线网络)之间搭一个“桥”,WDS也就是将两个无线网络连接到一起的意思。
NAT英文全称是“zhidaoNetwork Address Translation”,中文意思是“网络地址转换”模式。
NAT模式它是一个IETF标准,允许一个整体机构以一个公用IP地址出现在Internet上。也就是说,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。
程序代码
#include "tcpClass.hpp"
#include
#include using std::stringstream;
using std::endl;int main(int argc,char* argv[])
{if(argc != 3){cout<<"请输入正确的参数 [./ser] [ip] [port]"<<endl;return 0;}string ip = argv[1];uint16_t port = atoi(argv[2]);TcpClass ts;if(!ts.CreateSocket()){return 0;}if(!ts.Bind(ip, port)){return 0;}if(!ts.Listen()){return 0; }TcpClass ser_ts;while(1){struct sockaddr_in cli_addr;if(!ts.Accept(cli_addr,ser_ts)){return 0;}string buf;ser_ts.Recv(buf);cout<<"chrom say: "<<buf<<endl;string body = "hello world
";stringstream ss;//200ss << "HTTP/1.1 200 OK\r\n";//302//ss << "HTTP/1.1 302 Found\r\n";//404//ss << "HTTP/1.1 404 Page Not Found\r\n";//502//ss << "HTTP/1.1 502 Bad Gateway\r\n";ss << "Content-Type: text/html\r\n";ss << "Content-Length: " << body.size() << "\r\n";ss << "\r\n";string header = ss.str();ser_ts.Send(header);ser_ts.Send(body);}ser_ts.Close();ts.Close();return 0;
}
makefile
ser:ser.cppg++ $^ -o $@ -g
运行结果

- 200状态

- 302状态

- 404状态

- 502状态

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
