在.py文件的同级目录准备web静态文件的结构,如图所示

import os
import socket
import threading
class httpWebServer:
def __init__(self):
# 创建套接字,处理socket
# AF_INET IPV4,SOCK_STREAM TCP的协议
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 1.绑定单口
tcp_server_socket.bind(("", 9001))
# 2. 设置监听
tcp_server_socket.listen(128)
self.tcp_server_socket = tcp_server_socket
@staticmethod
def handle_requst_page(new_client, ):
# 4. 接受请求
try:
recv_data = new_client.recv(4096)
recv_content = recv_data.decode('utf-8')
resv_page = recv_content.split(" ", 2)
if len(resv_page) >= 2:
page_index = resv_page[1]
# 发送的数据为空时 /
# 当传入地址为空时,默认index地址
if page_index == '/':
page_index = '/index.html'
# 5.发送请求
"""
HTTP/1.1 200 OK # 报文行
Server: BWS/1.1 # 报文头
空格 \r\n
Response: xxx # 报文体
"""
path = "web/static" + page_index
if not os.path.exists(path):
print("404")
path = "web/static/404.html"
with open(path, 'rb') as file:
res_content = file.read()
res_line = "HTTP/1.1 200 OK\r\n"
res_server = "Server: PWS/1.0\r\n"
response = (res_line +
res_server +
"\r\n").encode("utf-8") + res_content
new_client.send(response)
except ValueError:
print("错误信息:", ValueError)
finally:
new_client.close()
def start(self):
while True:
# 3.等待客户端请求
new_client, ip_port = self.tcp_server_socket.accept()
print("链接的客户端为",ip_port)
# 创建线程处理多个链接,并设置主线程守护daemon=True
sub_thread = threading.Thread(target=self.handle_requst_page,args=(new_client,),daemon=True)
# sub_thread.setDaemon(True) #设置主线程守护的第二种方法
sub_thread.start()
# tcp socket 报文处理
def main():
# 常见web 服务器实例
http_web = httpWebServer()
#启动web 服务器
http_web.start()
if __name__ == '__main__':
main()
1002

被折叠的 条评论
为什么被折叠?



