#python #network-programming
#python #сетевое программирование
Вопрос:
Я новичок в сетевом программировании, но стар для Python. У меня есть простая программа blotter, которая должна использоваться на нескольких клиентских компьютерах. Промокашка работает двумя способами, она может отображать и обновлять информацию в базе данных. Чтобы избежать появления промокашек, отображающих старые данные, как я могу заставить все промокашки повторно извлекать информацию из базы данных, как только другая промокашка обновит некоторые данные в базе данных?
Я бы предпочел избежать сложностей при настройке некоторого протокола клиент-сервер. Возможно ли создать какую-либо форму протокола только для клиентов, в котором простое сообщение об обновлении передается непосредственно другим блокам, когда им нужно обновить свою информацию?
Комментарии:
1. какова текущая логика его скрипта на python?
2. На самом деле не понимаю этого вопроса.
3. Какова частота изменений? Является ли набор данных одинаковым для всех промокашек? Blotter записывает один параметр из источника данных или нового набора данных с несколькими значениями? Не могли бы вы уточнить характер информации?
4. Это один и тот же набор данных для всех промокашек. Промокашки могли обновлять произвольный объем данных в базе данных в любое время. Частота изменений, однако, невелика, скорее минуты, чем секунды между изменениями.
Ответ №1:
Чтобы получать сообщения (например, пакет UDP, предложенный другим постером, или http-запрос), клиентам пришлось бы запускать базовый сервер на клиентском компьютере. Например, вы могли бы использовать модуль Python xmlrpc. Однако локальный брандмауэр может блокировать внутреннюю связь.
Самым простым решением, если количество клиентов невелико, будет частый опрос базы данных на предмет изменений: добавьте столбец «время последнего изменения» в вашу таблицу чертежей и попросите клиентов проверить это поле. Таким образом, клиенты могут узнать, нужно ли им перезагружать чертеж, не тратя слишком много ресурсов.
Редактировать: поле последнего изменения может либо активно обновляться клиентом, который внес изменения в чертеж, либо автоматически обновляться триггером базы данных.
Комментарии:
1. Один вопрос, могу ли я запустить сервер сокетов (я предполагаю, что это то, что вы имеете в виду) на каждом клиенте (компьютере)? Не придется ли мне иметь один сервер сокетов, а затем множество возможных клиентов сокетов?
2. Серверы прослушивают сокет для входящих подключений, клиенты устанавливают эти подключения. Конечно, вы можете реализовать один сервер на Python и подключаться к нему с каждого клиента повторно, чтобы проверить, есть ли сообщение от другого клиента, но вы можете сделать то же самое с базой данных. Чтобы избежать частых подключений, вам нужна другая архитектура: экземпляры вашего приложения для рисования прослушивают входящие подключения и обновляют свой чертеж, если получают соответствующее сообщение. При запуске они должны подписаться на ленту новостей, например, добавив свой адрес в таблицу базы данных.
3. В вашей реализации также учитывайте, что произойдет, если клиент не работает или недоступен, а сообщения не могут быть доставлены. Возможно, именно поэтому на другом плакате предлагался UDP (вместо TCD). Однако обратите внимание, что UDP-пакеты могут быть потеряны. Я бы выбрал решение «время последнего изменения», если только нет очень веских причин против этого.
4. Последнее измененное решение, вероятно, самое простое, но оно также включает в себя опрос, т. Е. Данные не обновляются в реальном времени, и к базе данных будет много ненужных запросов. Я не возражаю против накладных расходов на код решения для сокетов. Проще всего ли это сделать с помощью сокетов, или мне следует обратить внимание на другие фреймворки, такие как Twisted? Есть ли какие-нибудь хорошие примеры кода?
5. В этом конкретном приложении с сокетами будет проще, поскольку сообщения очень короткие. Взгляните на wiki. python.org/moin/UdpCommunication запустите цикл receiver в отдельном потоке (он блокируется во время ожидания) и отправьте событие redraw в ваш графический интерфейс вместо печати сообщения. Необязательно, ответьте серверу, что вы получили сообщение, и попросите сервер повторять сообщение каждые 20 мс, потому что UDP-пакеты могут быть потеряны. (После секундного отсутствия ответа сервер должен предположить, что клиент был закрыт.)
Ответ №2:
Вы могли бы использовать триггеры. Когда информация обновляется, отправьте сигнал (вы сами выбираете, как, возможно, просто udp-пакет) всем блоутерам, которые будут последовательно обновлять свою информацию. Postgresql может быть написан с использованием python.