Python3 ASYNCIO:利用无限循环的多个连接和妥善关闭连接

问题描述 投票:0回答:1

我有服务器,我需要保持与客户的连接尽可能长。我需要让多个客户端连接到该服务器。码:

class LoginServer(BaseServer):

    def __init__(self, host, port):
        super().__init__(host, port)

    async def handle_connection(self, reader: StreamReader, writer: StreamWriter):
        peername = writer.get_extra_info('peername')
        Logger.info('[Login Server]: Accepted connection from {}'.format(peername))

        auth = AuthManager(reader, writer)

        while True:
            try:
                await auth.process()
            except TimeoutError:
                continue
            finally:
                await asyncio.sleep(1)

        Logger.warning('[Login Server]: closing...')
        writer.close()

    @staticmethod
    def create():
        Logger.info('[Login Server]: init')
        return LoginServer(Connection.LOGIN_SERVER_HOST.value, Connection.LOGIN_SERVER_PORT.value)

问题:目前只有一个客户端可以连接到该服务器。看来插座不正常关闭。而且因为这甚至以前的客户端无法重新连接。我想这是因为无限循环的存在。如何解决这个问题呢?

python python-3.5 infinite-loop python-asyncio
1个回答
1
投票

while循环是正确的。

如果你想上的数据等待来自客户端的服务器,你会在你的handle_connection下面的循环。

while 1:
    data = await reader.read(100)
    # Do something with the data

见例如回声服务器此处查找有关读/写的详细信息。

https://asyncio.readthedocs.io/en/latest/tcp_echo.html

你的问题可能是这个函数不返回,并循环本身没有任何await'g。这将意味着ASYNCIO循环永远不会重新获得控制权,以便新的连接不能进行。

await auth.process()
© www.soinside.com 2019 - 2024. All rights reserved.