Python3 asyncio: использование бесконечного цикла для нескольких соединений и правильное закрытие соединения - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть сервер, на котором мне нужно как можно дольше поддерживать связь с клиентом.Мне нужно разрешить нескольким клиентам подключаться к этому серверу.Код:

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)

Проблема: в настоящее время только один клиент может подключиться к этому серверу.Кажется, сокет не закрывается должным образом.И из-за этого даже предыдущий клиент не может восстановить соединение.Я думаю, это потому, что существует бесконечный цикл.Как решить эту проблему?

1 Ответ

0 голосов
/ 12 февраля 2019

Цикл while правильный.

Если вы хотите, чтобы сервер ожидал данных от клиента, в вашем handle_connection был бы следующий цикл.

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

См. Пример сервера echo здесь для получения дополнительной информации о чтении / записи.

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

Вероятно, ваша проблема в том, что эта функция не возвращается и выполняет цикл без ожидания чего-либо.Это означало бы, что асинхронный цикл никогда не восстановит контроль, поэтому новые соединения не могут быть установлены.

await auth.process()
...