import socket
import os
import re
def service_client(new_socket):
"""为这个客户端返回数据"""
try:
# 1.接收浏览器发送过来的请求,即HTTP请求
request = new_socket.recv(1024)
request = request.decode("utf-8") # 解码
request_lines = request.splitlines() # 按行分割请求,并存储在列表中
print(request_lines)
# GET /index.html HTTP/1.1
# 提取请求的文件路径
file_name = ""
if request_lines:
ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
if ret:
file_name = ret.group(1)
if file_name == "/":
file_name = "/index.html"
# 2.返回HTTP格式的数据,给浏览器
try:
# 准备发送的body,打开HTML文件
with open(os.path.join('D:\\files\\PycharmProjects\\InterfaceTest\\report\\html', file_name.lstrip('/')), 'rb') as f:
html_content = f.read()
# 准备发送的header
response = "HTTP/1.1 200 OK\r\n"
response += "Content-Type: text/html\r\n"
response += "\r\n" # header与body之间必须隔一行
# 发送header
new_socket.send(response.encode("utf-8"))
# 发送HTML内容
new_socket.send(html_content)
except FileNotFoundError:
response = "HTTP/1.1 404 NOT FOUND\r\n"
response += 'Content-Type: text/html\r\n'
response += '\r\n'
response += "<html><body><h1>404 Not Found</h1></body></html>"
new_socket.send(response.encode("utf-8"))
except Exception as e:
print(f"Error: {e}")
finally:
new_socket.close()
def main():
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 服务器先关闭,保证重新开启不占用端口
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcp_server_socket.bind(("", 7890)) # 绑定到0.0.0.0以接受所有网络接口上的连接
tcp_server_socket.listen(128)
print("Server is running...")
try:
while True:
# 等待新客户端的链接
new_socket, client_addr = tcp_server_socket.accept()
print(f"Connection from {client_addr}")
# 为每个客户端处理请求
service_client(new_socket)
except KeyboardInterrupt:
print("Server is shutting down...")
finally:
tcp_server_socket.close()
if __name__ == '__main__':
main()