http静态服务器
代码
from socket import *
from multiprocessing import Process
def rec_data(new_socket):
# 接收数据
require_data = new_socket.recv(1024)
if require_data:
# 将请求头转化为列表
require_data = require_data.splitlines()[0].decode('utf-8')
# 获取文件名
file_name = require_data.split(" ")[1]
# 拼接文件路径
if file_name == "/":
file = WEB_ROOT + "/index.html"
else:
file = WEB_ROOT + file_name
print(file)
try:
with open(file, "rb") as f:
html = f.read()
except:
# 拼接响应头
response_data = b"HTTP/1.1 400 NOT FOUND\r\n " + b"content-type: text/html; charset=UTF-8\r\n\r\n" + b"NOT FOUND"
new_socket.send(response_data)
else:
response_data = b"HTTP/1.1 200 OK\r\n\r\n" + html
new_socket.send(response_data)
else:
new_socket.close()
WEB_ROOT = "html"
def main():
# 创建对象
tcp_server = socket(AF_INET, SOCK_STREAM)
# 绑定端口和ip
tcp_server.bind(("", 8889))
# 创建监听
tcp_server.listen(5)
while True:
# 等待连接
new_socket, client = tcp_server.accept()
p = Process(target=rec_data, args=(new_socket,))
p.start()
# 关闭连接
new_socket.close()
if __name__ == '__main__':
main()
封装代码
from socket import *
from multiprocessing import Process
class WebServer(object):
def __init__(self, port=4545, listen=5):
# 创建对象
self.tcp_server = socket(AF_INET, SOCK_STREAM)
self.tcp_server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# 绑定端口和ip
self.tcp_server.bind(("", port))
# 创建监听
self.tcp_server.listen(listen)
def rec_data(self, new_socket):
# 接收数据
print('ssd')
require_data = new_socket.recv(1024)
if require_data:
# 将请求头转化为列表
require_data = require_data.splitlines()[0].decode('utf-8')
# 获取文件名
file_name = require_data.split(" ")[1]
# 拼接文件路径
if file_name == "/":
file = WEB_ROOT + "/index.html"
else:
file = WEB_ROOT + file_name
print(file)
try:
with open(file, "rb") as f:
html = f.read()
except:
# 拼接响应头
response_data = b"HTTP/1.1 400 NOT FOUND\r\n " + b"content-type: text/html; charset=UTF-8\r\n\r\n" + b"NOT FOUND"
new_socket.send(response_data)
else:
response_data = b"HTTP/1.1 200 OK\r\n\r\n" + html
new_socket.send(response_data)
else:
new_socket.close()
def run(self):
while True:
# 等待连接
new_socket, client = self.tcp_server.accept()
p = Process(target=self.rec_data, args=(new_socket,))
p.start()
# 关闭连接
new_socket.close()
WEB_ROOT = "html"
def main():
new = WebServer()
new.run()
if __name__ == '__main__':
main()
状态码:
200 成功
301 永久重定向
302 临时重定向
404 页面未找到
403 请求拒绝
500 服务器错误
请求
# 请求行
GET /2.html HTTP/1.1
# 请求头 浏览器告诉服务器自己的一些信息和可以接受的信息
Host: 127.0.0.1:8080
# 保持长连接
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
# 浏览器信息
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
# 可以接收的文件类型
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
# 可以处理的压缩格式
Accept-Encoding: gzip, deflate, br
# 我能听得懂的语言
Accept-Language: zh-CN,zh;q=0.9
响应
# 状态行
HTTP/1.1 200 OK
# 响应头
Server: nginx
# 告诉客户端用什么类型来处理文件
Content-Type: text/html;charset=UTF-8
# 内容 和响应头之间必需空一行
aaaaaa
- 短连接:客户端请求,服务端口响应,响应完了,马上断开连接,一次请求一次响应
- 长连接:客户端请求,服务端响应,客户端请求,服务端响应,客户端请求,服务端响应,长时间不操作,超时断开连接