Получать сообщения от сервера в качестве клиента в случайное время - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь написать простой мессенджер на python, поэтому мне приходится получать сообщения с сервера, когда другой клиент отправляет его туда. Я использую сокет, так есть ли простой способ получить эти случайные сообщения, или мне нужно написать некоторую конструкцию «while True» в моем клиенте?

1 Ответ

0 голосов
/ 23 апреля 2019

Существует два режима: блокирующий и неблокирующий.

Блокировка

Ваш код схематично выглядит так:

while not stop:
    message = read_message_from_socket(socket)
    # do something with message

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

И read_message_from_socket использует метод recv для чтения данных с сервера.

В этом случае вызов recv блокируется, что означает, что он не вернется, пока сервер не отправит некоторые данные.

Обратите внимание, что это очень упрощено, поскольку может случиться, что recvвернет только часть ожидаемых данных, поэтому, вероятно, внутри read_message_from_socket будет цикл для ожидания прочтения всего сообщения (он может основываться на известном размере сообщения или может полагаться на такой символ, какконец строки).

Non Blocking

В этом случае код клиента схематично выглядит так:


sel = selectors.DefaultSelector()

while not stop:
    events = sel.select(timeout=None)
    for key, mask in events:
        service_connection(key, mask)

        if mask & selectors.EVENT_READ:
           socket = key.fileobj
           message = read_actual_message_from_socket(socket)
           # process the message

В этом случае вызов selectбудет блокироваться, пока новые данные не поступят с сервера.И гарантируется, что read_actual_message_from_socket будет считывать некоторые данные (так же, как и в предыдущем случае, он может получить только некоторую часть данных, поэтому это требует дополнительной обработки).

Более вводная информация об этом здесь и некоторые примеры здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...