1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| import sys import socket import threading
def check(param): if len(param) != 2: return False if not param[1].isdigit(): return False return True
def get_port_param(param): port = 8089 if check(param): port = param[1] else: print("命令行不符合:【python3 xxx.python 端口号】,采用默认端口号: 8089") return int(port)
def build_response(status_code, file_data): response_line = "HTTP/1.1 " + status_code + "\r\n" response_header = "Server: PWS/1.0\r\n" response_body = file_data response = (response_line + response_header + "\r\n").encode("utf-8") + response_body return response
class HttpWebServer(object): def __init__(self, port): 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(("", port)) tcp_server_socket.listen(128) self.tcp_server_socket = tcp_server_socket
@staticmethod def handle_client_request(new_socket): recv_data = new_socket.recv(4096) if len(recv_data) == 0: new_socket.close() return
recv_content = recv_data.decode("utf-8") print(recv_content)
request_list = recv_content.split(" ", maxsplit=2) request_path = request_list[1] print(request_path)
if request_path == "/": request_path = "/index.html"
try: with open("static" + request_path, "rb") as file: file_data = file.read()
response = build_response("200 OK", file_data) new_socket.send(response) except Exception as e: with open("static/error.html", "rb") as file: file_data = file.read()
response = build_response("404 Not Found", file_data) new_socket.send(response) finally: new_socket.close()
def start(self): while True: new_socket, ip_port = self.tcp_server_socket.accept() sub_thread = threading.Thread(target=self.handle_client_request, args=(new_socket,)) sub_thread.setDaemon(True) sub_thread.start()
def main(): port = get_port_param(sys.argv); sever = HttpWebServer(port); sever.start() print("启动完毕!")
if __name__ == '__main__': main()
|