我尝试为我的游戏专用服务器制作异步套接字内核。这是可行的,但不要接受超过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())
我尝试使用模块选择,但这有滞后的断开连接。