import socket
if __name__ == '__main__':
# 创建tcp服务端套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口号复用, 程序退出端口立即释放
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定端口号
tcp_server_socket.bind(("", 8001))
# 设置监听
tcp_server_socket.listen(128)
while True:
# 等待接受客户端的连接请求
new_socket, ip_port = tcp_server_socket.accept()
# 代码执行到此,说明连接建立成功
recv_client_data = new_socket.recv(4096)
# 对二进制数据进行解码
recv_client_content = recv_client_data.decode("utf-8")
print(recv_client_content)
with open("static/index.html", "rb") as file:
# 读取文件数据
file_data = file.read()
# 响应行
response_line = "HTTP/1.1 200 OK\r\n"
# 响应头
response_header = "Server: Python-server\r\n"
# 响应体
response_body = file_data
# 拼接响应报文
response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
# 发送数据
new_socket.send(response_data)
# 关闭服务与客户端的套接字
new_socket.close()
计算机网络
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的www文件都必须遵守这个标准。
GET:请求读取由URL所标志的信息。
POST:给服务器添加信息(如注释)。
PUT:在给定的URL下存储一个文档。
DELETE:删除给定的URL所标志的资源。
1)Get是从服务器上获取数据,Post是向服务器传送数据。
2)Get是把参数数据队列加到提交表单的Action属性所指向的URL中,值和表单内各个字段一一对应,在URL中可以看到。
3)Get传送的数据量小,不能大于2KB;Post传送的数据量较大,一般被默认为不受限制。
4)根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。
I. 所谓 安全的 意味着该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。
II. 幂等 的意味着对同一URL的多个请求应该返回同样的结果。
组成:
原始报文:(每行末尾都有一个 ‘\r\n’)
GET / HTTP/1.1 \r\n
Host: localhost:8001\r\n
Connection: keep-alive\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
Cookie: pgv_pvi=1246921728; \r\n
\r\n (请求头信息后面还有一个单独的’\r\n’不能省略)
GET / HTTP/1.1 \r\n
\r\n
组成键 | 值 | 说明 |
---|---|---|
Host | localhost:8001 | 服务器的主机地址和端口号,默认是80 |
Connection | keep-alive | 和服务端保持长连接 |
Upgrade-Insecure-Requests | 1 | 让浏览器升级不安全请求,使用https请求 |
User-Agent | Mozilla/5.0… | 用户代理,也就是客户端的名称 |
Accept | text/html, application/xhtml+xml,application/xml;… | 可接受的数据类型 |
Accept-Encoding | gzip, deflate | 可接受的压缩格式 |
Accept-Language | zh-CN,zh;q=0.9 | 可接受的语言,q代表权值 |
Cookie | pgv_pvi=1246921728; | 登录用户的身份标识 |
\r\n
组成:
原始报文:(每行末尾都有一个 ‘\r\n’)
POST /adduser HTTP/1.1\r\n
Host: localhost:8001\r\n
Connection: keep-alive\r\n
Content-Type: application/x-www-form-urlencoded\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36\r\n
\r\n(请求头信息后面还有一个单独的’\r\n’不能省略)
// Form Data
username=hello&pass=hello
POST /adduser HTTP/1.1\r\n
\r\n
组成,其它参数同get请求键 | 值 | 说明 |
---|---|---|
Content-Type | application/x-www-form-urlencoded | 告诉服务端请求的数据类型 |
空行
与请求体之间要有一个空行\r\n
请求体
表单默认的数据格式: username=hello&pass=hello
组成:
原始报文:(每行末尾都有一个 ‘\r\n’)
---响应头----
HTTP/1.1 200 OK\r\n
---响应行----
Server: apache\r\n
Content-Type: text/html; charset=UTF-8\r\n
Transfer-Encoding: chunked\r\n
Connection: keep-alive\r\n
Date: Sun, 28 Jun 2020 09:01:10 GMT\r\n
---空行----
\r\n(响应头信息后面还有一个单独的’\r\n’不能省略)
---响应体----
<!DOCTYPE html><html lang=“en”> …</html>
HTTP/1.1 200 OK\r\n
\r\n
组成键 | 值 | 说明 |
---|---|---|
Server | apache | 服务器名称 |
Content-Type | text/html; charset=UTF-8 | 内容类型 |
Transfer-Encoding | chunked | 发送结束的标记是0\r\n, Content-Length表示服务端确定发送给客户端的内容大小,但是二者只能用其一。 |
Connection | keep-alive | 和客户端保持长连接 |
Date | Sun, 28 Jun 2020 09:01:10 GMT | 服务端的响应时间 |
空行
与请求体之间要有一个空行\r\n
响应体
…
响应给客户端的数据
POST请求报文数据格式
我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后续请求时,Keep-Alive功能避免了建立或者重新建立连接。
如上图中,左边的是关闭Keep-Alive的情况,每次请求都需要建立连接,然后关闭连接;右边的则是Keep-Alive,在第一次建立请求之后保持连接,然后后续的就不需要每次都建立、关闭连接了, 启用Keep-Alive模式肯定更高效,性能更高,因为避免了建立/释放连接的开销 。
http 1.0中默认是关闭的,需要在http头加入"Connection: Keep-Alive",才能启用Keep-Alive;http 1.1中默认启用Keep-Alive,如果加入"Connection: close ",才关闭。目前大部分浏览器都是用http1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep- Alive连接就看服务器设置情况。
HTTP 状态码是用于表示web服务器响应状态的3位数字代码。
状态码 | 说明 |
---|---|
200 | 请求成功 |
307 | 重定向 |
400 | 错误的请求,请求地址或者参数有误 |
404 | 请求资源在服务器不存在 |
500 | 服务器内部源代码出现错误 |