我尝试为我的游戏专用服务器制作异步套接字内核。这是可行的,但不要接受超过1个客户端。2个客户端尝试连接,但第二个客户端无法连接,只有当第一个客户端断开连接时。
import asyncio, socket, time
class Server:
    def __init__(self, port: int):
        self.server = socket.socket()
        self.port = port
    async def start(self):
        self.server.bind(("0.0.0.0", self.port))
        self.server.listen()
        print(f"Server started on {self.port}!")
        while True:
            session, ip = self.server.accept()
            print(f"{ip[0]} connected!")
            await Connection(session, ip[0]).messaging()
class Connection:
    def __init__(self, session, ip):
        self.session =  session
        self.ip = ip
    def receive(self, session, lens):
        data = b""
        while len(data) < lens:
            s = session.recv(lens)
            if not s:
                s += 0
                break
            data += s
        return data
    async def messaging(self):
        last = int(time.time())
        while True:
            try:
                header = self.session.recv(7)
                if len(header) > 0:
                    last = int(time.time())
                    mtype = int.from_bytes(header[:2], "big")
                    mlen = int.from_bytes(header[2:5], "big")
                    mdata = self.receive(self.session, mlen)
                    print(f"[C] {mtype} from {self.ip}")
                    if int(time.time()) - last > 7:
                        break
            except(ConnectionAbortedError, ConnectionResetError, ConnectionRefusedError, TimeoutError, OSError):
                break
        self.session.close()
        print(f"{self.ip} disconnected!")
asyncio.run(Server(9339).start())
我尝试使用模块选择,但这有滞后的断开连接。