Web静态服务器-4-多线程

    xiaoxiao2021-04-15  312

    #coding=utf-8 import socket import re import threading class WSGIServer(object): def __init__(self, server_address): # 创建一个tcp套接字 self.listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 允许立即使用上次绑定的port self.listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 绑定 self.listen_socket.bind(server_address) # 变为被动,并制定队列的长度 self.listen_socket.listen(128) def serve_forever(self): "循环运行web服务器,等待客户端的链接并为客户端服务" while True: # 等待新客户端到来 client_socket, client_address = self.listen_socket.accept() print(client_address) new_process = threading.Thread(target=self.handleRequest, args=(client_socket,)) new_process.start() # 因为线程是共享同一个套接字,所以主线程不能关闭,否则子线程就不能再使用这个套接字了 # client_socket.close() def handleRequest(self, client_socket): "用一个新的进程,为一个客户端进行服务" recv_data = client_socket.recv(1024).decode('utf-8') print(recv_data) requestHeaderLines = recv_data.splitlines() for line in requestHeaderLines: print(line) request_line = requestHeaderLines[0] get_file_name = re.match("[^/]+(/[^ ]*)", request_line).group(1) print("file name is ===>%s" % get_file_name) # for test if get_file_name == "/": get_file_name = DOCUMENTS_ROOT + "/index.html" else: get_file_name = DOCUMENTS_ROOT + get_file_name print("file name is ===2>%s" % get_file_name) # for test try: f = open(get_file_name, "rb") except IOError: response_header = "HTTP/1.1 404 not found\r\n" response_header += "\r\n" response_body = "====sorry ,file not found====" else: response_header = "HTTP/1.1 200 OK\r\n" response_header += "\r\n" response_body = f.read() f.close() finally: client_socket.send(response_header.encode('utf-8')) client_socket.send(response_body) client_socket.close() # 设定服务器的端口 SERVER_ADDR = (HOST, PORT) = "", 8888 # 设置服务器服务静态资源时的路径 DOCUMENTS_ROOT = "./html" def main(): httpd = WSGIServer(SERVER_ADDR) print("web Server: Serving HTTP on port %d ...\n" % PORT) httpd.serve_forever() if __name__ == "__main__": main()

    想了解更多测试、开发的知识、技能,或者职业规划,可以交流😍

     


    最新回复(0)