HTTP协议搭建简单WEB服务器

对HTTP研究

概念

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。Ted Nelson组织协调万维网协会和互联网工程工作小组共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1

典型实例

典型发送消息:

GET /favicon.ico HTTP/1.1
Host: 127.0.0.1
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6756.400 QQBrowser/10.3.2473.400
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Referer: http://127.0.0.1/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9

GET /favicon.ico HTTP/1.1
提交方式+URL地址+协议版本+协议头
典型的响应消息:

HTTP/1.1 200 OK
Server:Apache/1.3.14(Unix)
Content-type:text/html
Content-length:39725426

正文

HTTP/1.1 200 OK
协议版本+状态码+信息

请求方式

告知服务器意图的HTTP方法
GET:用来请求访问已被URI识别的资源,指定的资源经服务器解析后返回响应内容;

POST:传输实体主体;
PUT:传输文件,鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般的网站不建议使用该方法。若配合Web应用程序的验证机制,或架构设计采用REST标准的同类Web网站,就可能会开放使用PUT方法。

HEAD:获得报文首部,和GET方法一样,只是不返回报文主体部分,用于确认URI的有效性及资源更新的日期时间等。
DELETE:删除文件,和PUT方法一样不带验证机制。

OPTIONS:用来查询针对请求URI指定的资源支持的方法。
TRACE:追踪路径,客户端通过TRACE方法可以查询发送出去的请求是怎样被加工修改/篡改的。这是因为,想要连接到源目标服务器可能会通过代理中转,TRACE方法就是用来确认连接过程中发生的一系列操作。

CONNECT: 要求用隧道协议连接代理。CONNECT方法在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL和TLS协议把通信内容经网络隧道传输。

报文格式编辑

HTTP报文由从客户机到服务器的请求和从服务器到客户机的响应构成。

请求报文格式如下:
请求行 - 通用信息头 - 请求头 - 实体头 - 报文主体

应答报文格式如下:
状态行 - 通用信息头 - 响应头 - 实体头 - 报文主体

状态码元由3位数字组成,表示请求是否被理解或被满足。原因分析是对原文的状态码作简短的描述,状态码用来支持自动操作

版本历史

HTTP/1.0 这是第一个在通讯中指定版本号的HTTP 协议版本,至今仍被广泛采用,特别是在代理服务器中。

HTTP/1.1 当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。

HTTP/1.1相较于 HTTP/1.0 协议的区别主要体现在:
1 缓存处理
2 带宽优化及网络连接的使用
3 错误通知的管理
4 消息在网络中的发送
5 互联网地址的维护
6 安全性及完整性

相关资料

https://baike.baidu.com/item/http/243074?fromtitle=HTTP协议&fromid=1276942&fr=aladdin
https://blog.csdn.net/shiyongyue/article/details/77368539

易语言实例代码

需要支持库

.版本 2
.支持库 eSocket
.支持库 spec
.支持库 eAPI

.程序集 窗口程序集_窗口1

.子程序 _按钮1_被单击

TCP服务器1.启动 (, , , 5000, )


.子程序 _TCP服务器1_客户进入
.参数 user, 同步套接字, 参考
.局部变量 data, 字节集
.局部变量 发送文本, 文本型
.局部变量 接收, 文本型
.局部变量 提交方式, 整数型
.局部变量 路径, 文本型
.局部变量 协议版本, 文本型
.局部变量 协议头, 文本型
.局部变量 图片, 字节集
.局部变量 发送字节集, 字节集

data = user.接收 (10)
接收 = 到文本 (data)
解析返回文本 (接收, 提交方式, 路径, 协议版本, 协议头)
调试输出 (提交方式, 路径, 协议版本, 协议头)
.判断开始 (路径 = “/”)
    发送文本 = 到文本 (返回文本生成 (, “200”, , “Content-Type:text/html;charset=utf-8;”, 编码_gb2312到utf8 (“”), ))
    user.发送 (发送文本, 10)
.判断 (路径 = “/data.bmp”)
    图片 = 截取屏幕区域 (, 2, )
    发送字节集 = 返回文本生成 (, “200”, , “Content-Type:image/png”, , 图片)

    user.发送 (发送字节集, 10)
.默认

.判断结束


user.断开连接 ()

.子程序 _TCP服务器1_停止服务




.子程序 返回文本生成, 字节集, 公开, 默认200
.参数 协议版本, 文本型, 可空
.参数 状态码, 文本型, 可空
.参数 消息信息, 文本型, 可空
.参数 协议头, 文本型, 可空
.参数 正文, 文本型, 可空
.参数 正文字节集, 字节集, 可空

.判断开始 (协议版本 = “”)
    协议版本 = “HTTP/1.1”
.默认

.判断结束
.判断开始 (消息信息 = “”)
    消息信息 = “OK”
.默认

.判断结束
.判断开始 (协议头 ≠ “”)
    协议头 = 协议头 + #换行符
.默认

.判断结束
返回 (到字节集 (协议版本 + “ ” + 状态码 + “ ” + 消息信息 + #换行符 + 协议头 + #换行符 + 正文) + 正文字节集)

.子程序 解析返回文本, , 公开
.参数 消息, 文本型
.参数 提交方式, 整数型, 可空
.参数 访问路径, 文本型, 可空
.参数 协议版本, 文本型, 可空
.参数 协议头, 文本型, 可空

.判断开始 (取文本左边 (消息, 3) = “GET”)
    提交方式 = 0
.默认

.判断结束
.判断开始 (取文本左边 (消息, 4) = “POST”)
    提交方式 = 1
.默认

.判断结束
访问路径 = 文本_取出中间文本 (消息, “ ”, “ ”, , )
协议版本 = 文本_取出中间文本 (消息, 访问路径 + “ ”, #换行符, , )
调试输出 (消息)
协议头 = 文本_取右边 (消息, 协议版本, , )

欢迎加入我们的交流群

你可能感兴趣的:(WEB)