自己动手web服务器06--面向对象(II)

本服务器层层进化--不断完善  如有错误请批评指正
import socket
import re
import multiprocessing

class WSGIServer(object):
    # 创建套接字
    def __init__(self): #实例方法
        """完成初始化的工作:创建套接字"""
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 地址重用(1.设置 0.取消)
        self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        # 绑定端口
        self.server_socket.bind(("", 8888))
        # 监听
        self.server_socket.listen(128)
    def request_handler(self, client_socket):
        """创建处理客户端请求的函数"""
        # 客户端接受请求
        recv_data = client_socket.recv(4096)
        if not recv_data:
            print("客户端断开链接")
            client_socket.close()
            return
        # 解码请求报文数据
        recv_str_data = recv_data.decode()
        # 截取路径
        ret = re.match(r"[^/]+([^ ])+", recv_str_data)
        path_info = ret.group(1)
        print(path_info)
        # 当用户只输入域名(IP) + [端口]  用户请求路径是/
        if path_info == "/":
            path_info = "/index.html"
        try:   #尝试打开用户需要的文件, 不存在则抛出异常
            with open("./static" + path_info, "rb") as file:
                file_data = file.read()
        except Exception as e:  #抛出异常执行
            reponce_line = "HTTP/1.1 404 Not\r\n"
            reponce_hearder = "Server:PythonServer1.0"
            reponce_body = "ERROR"
            # 响应数据的拼接
            reponce_data = reponce_line + reponce_hearder + "\r\n" + reponce_body
            client_socket.send(reponce_data.encode())
        else:      #不抛出异常执行
            reponce_line = "HTTP1.1 200 OK\r\n"
            reponce_hearder = "Server:PythonServer1.0\r\n"
            reponce_body = file_data
            # 响应数据的拼接           因前面是二进制,不能直接拼接,需要转化
            reponce_data = (reponce_line + reponce_hearder + "\r\n").encode() + reponce_body
            client_socket.send(reponce_data)
        finally:
            client_socket.close()
    def start(self):
        while True:  # 接收
            client_socket, client_address = self.server_socket.accept()
            # 打印
            print("接收到%s链接请求" % str(client_address))
            thid = multiprocessing.Process(target=self.request_handler, args=(client_socket,))
            thid.start()
            # client_socket.close()
def main():
    # 创建一个服务器
    wsgi_server = WSGIServer()
    # 运行服务器
    wsgi_server.start()
if __name__ == '__main__':
    main()

你可能感兴趣的:(自己动手web服务器06--面向对象(II))