Как проверить, живо ли соединение в Python? - PullRequest
0 голосов
/ 27 сентября 2019

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

Это метод слушателя из написанного мною класса:

def listenForConnections(self):
        self.s.bind((self.HOST, self.PORT)) 
        while True:
            self.s.listen(128)
            c, addr = self.s.accept()
            self.c = c
            print("\n[+]Got a new connection!")
            self.conns.append(c)

Как видите, он добавляет новый объект соединения в список, из которого вы затем можете выбрать цель с помощью метода getTarget () из того же класса, но я не буду вставлять его здесь, так как вы, вероятно,знаю, как это выглядит.Имейте в виду, что слушатель работает в отдельном потоке.Теперь я хотел бы написать функцию ping (), которая проверяет каждую пару секунд, все ли соединения в списке conns все еще живы, но я понятия не имею, как это сделать.Я думал, что в методе ping мне придется отправлять некоторые данные клиенту каждые пару секунд, но я боюсь, что это сломает всю программу, потому что клиент может думать, что это правильная команда, отправленная пользователем, а не какая-томусор, чтобы проверить, живо ли соединение или нет.

1 Ответ

0 голосов
/ 27 сентября 2019

Если вы хотите использовать сообщение PING для обнаружения, если клиент еще жив, то вы должны указать это в протоколе клиент / сервер.Как вы уже отметили, клиент должен видеть, что это сообщение PING, а не «обычное» сообщение.Это работает, только если вы можете изменить протокол клиент / сервер.Это сложнее реализовать, если протокол клиент / сервер строго основан на запросе / ответе, поскольку теперь сервер также может инициировать сообщения.

Существуют и другие варианты:

  • Есликлиент корректно закрывает соединение, сервер может определить это в следующий раз, когда попытается связаться с клиентом.
  • Если клиент обычно отправляет запросы постоянно, можно считать, что клиент не работает, и закрыть соединение, если клиентне отправляла новые запросы в течение некоторого времени.
  • Вы можете использовать TCP / IP keepalive для обнаружения мертвых клиентов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...