Поддержание TCP-соединения

#python #tcp

#python #tcp

Вопрос:

У меня есть программа на Python, которая считывает значения из АЦП, затем записывает их в файл, а также отправляет их через TCP, если доступно соединение. Я могу отправить данные нормально, однако, поскольку данные постоянно считываются, я хотел бы иметь возможность поддерживать соединение открытым. Как мне заставить клиента проверить, что на сервере есть больше данных для отправки, и, таким образом, сохранить соединение открытым?

Комментарии:

1. Почему вы не можете просто отправить на сервер команду (в виде строки), которая приведет к ответу, независимо от того, есть ли у него данные для отправки или нет?

2. Попробуйте отправлять сообщения Keep alives каждые секунды (некоторые произвольные данные)

Ответ №1:

Этот сценарий кажется очень похожим на одно из наших приложений. Для этого мы используем ZeroMQ.

Использование ZeromMQ с PUB / SUB

В документе PyZMQ приведен пример использования Pub / Sub.

Поставщик данных создает сокет PUB и отправляет ему сообщения.

Потребитель данных настраивает вспомогательный сокет и считывает сообщения из.

Обычно сокет PUB является фиксированной частью инфраструктуры, поэтому он привязывается к некоторому порту и подключается к югу. Но если хотите, вы можете переключить его, и он тоже работает.

Преимущества:

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

Другие шаблоны обмена сообщениями с ZeroMQ

PUB / SUB — это всего лишь один из вариантов, существуют и другие комбинации, такие как PUSH / PULL, REQ / REP и т. Д.

У меня есть некоторые службы, работающие годами с PUSH / PULL, и они остаются «довольно хорошими» (обычно проходит 6 недель, прежде чем возникает необходимость в перезагрузке, но это скорее из-за проблем с оборудованием, чем в библиотеке ZeroMQ.)