python中单线程设置非阻塞循环模拟多线程

import socket

import re

def main():
    tcp_server = WebServer()

    tcp_server.run_server()

class WebServer(object):
    def run_server(self):
        """运行服务"""
        # 客户端列表
        clients = list()

        # 设置服务器端非堵塞
        self.tcp_server.setblocking(False)
        while True:
            try:
                client, addr = self.tcp_server.accept()
                # 客户端也是非堵塞
                client.setblocking(False)

                # 放到列表
                clients.append(client)
            except Exception as e:
                pass

            for client_new in clients:

                try:
                    data = client_new.recv(1024).decode()
                    print(data)
                    if data:
                        # 有数据
                        self.client_exec(client_new, data)
                    else:
                        print("客户端关闭")

                        client_new.close()
                        clients.remove(client_new)

                except Exception as e:
                    pass

        # 关闭服务器
        self.tcp_server.close()

    def client_exec(self, client, data):
        """单独客户端的处理"""
        # 接收数据

        head_lines = data.splitlines()
        try:
            print(head_lines[0])
            re_match = re.match(r'[^/]+(/[^ ]*)', head_lines[0])
            # 判断是否匹配
            if re_match:  
                file_name = re_match.group(1)
                if file_name == "/":
                    file_name = "/index.html"
        except Exception as e:
            print(e)  

        # 进行响应
        try:
            headers = "HTTP/1.1 200 OK\r\n"

            with open("./html%s" % file_name, 'rb') as f:  
                body = f.read()  

            # body = "show page is find!"

            # content = headers +"\r\n" +body
            content = headers + "\r\n"

            # client.send(content.encode("utf-8"))
            client.send(content.encode("utf-8"))
            client.send(body)
        except Exception as e:
            print(e)
            # 返回一个404页面
            head = "HTTP/1.1 404 NOT FIND\r\n"
            body = "not find page!"
            content = head + "\r\n" + body

            client.send(content.encode("utf-8"))

        # 关闭客户端
        client.close()

    def __init__(self):  
        """ 初始化tcp服务器"""
        self.tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.tcp_server.bind(("", 6789))
        self.tcp_server.listen(128)

if __name__ == '__main__':

    main()

猜你喜欢

转载自blog.csdn.net/aransam/article/details/79994423
今日推荐