一、http服务器的实现
import socket
import re
def client_request(new):
"""浏览器的请求"""
# 将浏览器的请求转换成列表
request_data = new.recv(1024).decode("utf-8").splitlines()
print(request_data)
print("-" * 50)
# 根据浏览器请求的路径响应对应的页面
# file_name = ""
rul = re.match(r"[^/]+(/[^ ]*)", request_data[0]) # [^/]:从左往右取,不是/都不取。 +:必须有/。 (/[^ ]*):从/开始取到空格
if rul:
file_name = rul.group(1)
if file_name == "/": # 如果请求没有指定要访问的页面,默认是/(/默认访问的就是主页)
file_name = "/index.html"
return file_name
def server_response(new, file_name):
"""服务器的响应:给浏览器的http格式的数据(header和body)"""
# body:响应的是一个主页
try:
f = open("./html"+file_name, "rb")
except:
response_header = "HTTP/1.1 404 NOT FOUND \r\n"
response_header += "\r\n"
response_header += "file not found"
new.send(response_header.encode("utf-8"))
else:
response_body = f.read()
f.close()
# header:响应的是一个头部信息
response_header = "HTTP/1.1 200 OK \r\n"
response_header += "\r\n"
# 将header和body响应给浏览器
response = response_header.encode("utf-8") + response_body
new.send(response)
def request_response(new):
"""浏览器的请求和服务器的响应"""
# 调用请求的函数
file_name = client_request(new)
# 调用响应的函数
server_response(new, file_name)
# 关闭客户端套接字
new.close()
def main():
# 创建套接字
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 端口重复使用
tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定(bind)
tcp_server.bind(("", 7896))
# 监听(listen)
tcp_server.listen(128)
while True:
# 等待客户端的连接(accept)
new, other = tcp_server.accept()
# 调用浏览器的响应和请求函数
request_response(new)
# 关闭服务器套接字
# tcp_server.close()
if __name__ == '__main__':
main()