закрытие сервера после закрытия всех клиентов - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть очень простой скрипт сокета, который отправляет одно сообщение клиентам.

Часть серверного скрипта:

while True:
    con,address=s.accept()
    con.send("Hello from server".encode())
    con.close()
s.close()

Часть клиентского скрипта:

message = s.recv(5)
while message:
    print("Message", message.decode())
    sleep(1)
    message=s.recv(5)
s.close()

Я запускаю 2 клиентов.Они оба печатают сообщение (по 5 байт за раз), затем закрываются.

Однако сервер остается открытым, поскольку он все еще ожидает клиентов.

Как правильно выйти изсервер while True цикл?

1 Ответ

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

Вы должны указать, при каком условии вы хотите, чтобы ваш сервер вышел.Обычно сервер запрограммирован как демон, то есть работает бесконечно.В python у вас уже есть способ разорвать бесконечный цикл while - Ctrl-C, чтобы вызвать исключение клавиатуры.В противном случае, подумайте о следующем:

  1. После обработки N клиентов, break внутри цикла.Вам нужно будет иметь счетчик и следить за обработанными клиентами
  2. Для некоторых сигналов POSIX, таких как ответ в Как перехватить SIGINT в Python? , и обычно этоспособ, которым демоны завершают работу красиво

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

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