Как запретить программе ждать получения сообщения от клиента? - PullRequest
0 голосов
/ 19 июня 2019

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

import socket
port = input("Port: ")
s = socket.socket()
s.bind(('', port))
s.listen(5)
a, b = s.accept()
print "Connection", "with", b[0], "Created Successfully"
while True:
    try:
        rec = a.recv(1024)
        print rec
    except:
        print "Time Out"

Я хочу, чтобы программа проверила, есть ли какое-либо значение в rec или нет (клиентская программа отправила что-нибудь или нет), если нет, он напечатает Time Out, не дожидаясь, пока клиент отправит что-либо.

Ответы [ 4 ]

1 голос
/ 19 июня 2019

Визит https://docs.python.org/2/library/socket.html#socket-objects Это для сокета python2.7

socket.setblocking (flag) Установить режим блокировки или неблокирования сокета: если флаг равен 0, сокет устанавливается нанеблокирование, иначе в режим блокировки.Изначально все розетки находятся в режиме блокировки.В неблокирующем режиме, если вызов recv () не находит данных или если вызов send () не может немедленно удалить данные, возникает исключение ошибки;в режиме блокировки вызовы блокируются, пока они не могут продолжаться.s.setblocking (0) эквивалентно s.settimeout (0.0);s.setblocking (1) эквивалентно s.settimeout (None).

socket.settimeout (значение) Устанавливает время ожидания при блокировании операций с сокетом.Значением аргумента может быть неотрицательное число с плавающей запятой, выражающее секунды, или None.Если задано значение с плавающей запятой, последующие операции сокета вызовут исключение тайм-аута, если значение периода тайм-аута истекло до завершения операции.Установка таймаута None отключает тайм-ауты при работе с сокетом.s.settimeout (0.0) эквивалентно s.setblocking (0);s.settimeout (None) эквивалентно s.setblocking (1).

1 голос
/ 19 июня 2019

Многопоточное программирование: вам нужно запустить функцию прослушивания потоком.

0 голосов
/ 20 июня 2019

В Python есть несколько опций. Просто чтобы назвать два, https://twistedmatrix.com/ и https://docs.python.org/3/library/asyncio.html

0 голосов
/ 19 июня 2019

Ваш вопрос относится к конкретной операционной системе.

Используйте select & poll - Ожидание завершения ввода / вывода операций. И, вероятно, модуль селекторы . Или найдите какой-нибудь цикл обработки событий модуль.

Возможно, вы захотите прочитать ALP , чтобы понять, как использовать системные вызовы Linux (перечислены в syscalls (2) ; читайте о poll ( 2) )

Вы можете прочитать Операционная система: Три простых компонента , чтобы узнать больше об ОС.

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