Delphi Сетевое программирование

У меня есть классическая программа клиент / сервер (толстый клиент и база данных), написанная на Delphi 2006. Когда в клиенте выполняются определенные условия, мне нужно очень быстро уведомить всех других клиентов. До сих пор это делалось с использованием широковещательных рассылок UDP, но это больше не жизнеспособно, поскольку клиенты теперь подключаются извне локальной сети, а широковещательная рассылка UDP ограничена локальной сетью.

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

Есть ли какие-либо другие наборы компонентов или технологии, на которые я должен обратить внимание, а также?

7 ответов

Решение

Простой ответ заключается в том, что стандартные протоколы, доступные в Delphi (и других инструментах), не допускают обратного уведомления. Я посмотрел на это для проекта, где я хотел использовать SOAP. Все они предполагают, что клиент запрашивает сервер, сервер отвечает и все.

Для меня решением стал RemObjects SDK. Это позволяет отправлять уведомления клиентам, и уведомление может содержать любые данные, которые вам нравятся (так же, как клиент-сервер). Я сам использую соединение SuperTCP, но оно работает и с другими. Он по-прежнему может предлагать интерфейс SOAP для клиентов, которые должны его использовать, но там, где у вас есть контроль над клиентом и сервером, он работает очень хорошо.

Есть несколько действительно простых способов сделать это с Delphi, хотя я уверен, что RemObjects SDK работает очень хорошо.

  1. Имейте центральный сервер, на котором * TIdTCPServer * прослушивает *. Тогда у каждого клиента есть TIdTCPClient. Они подключаются к серверу и блокируют чтение, ожидая записи сервером. Как только сервер получает уведомление через прослушивающий сокет, он вещает каждому ожидающему клиенту. Это в значительной степени немедленное уведомление всех клиентов.
  2. Имейте центральный сервер, на котором прослушивается TIdTCPServer. Тогда у каждого клиента есть TIdTCPClient. Эти клиенты могут "пинговать" сервер, чтобы запрашивать обновления через регулярные промежутки времени (использовать токен сеанса для поддержания состояния). Частота интервала определяет, насколько быстрым будет уведомление. Когда один из клиентов должен уведомить других, он просто уведомляет сервер. Затем сервер использует очередь сообщений для составления списка всех активных клиентских сеансов и добавляет уведомление для каждого из них. Затем в следующий раз, когда каждый из клиентов подключается, он отправляет ему уведомление и удаляет его из очереди.
  3. Сохраните таблицу сеансов в базе данных, где каждый клиент регулярно обновляет информацию о том, что у него есть активный сеанс, и удаляет себя при отключении. Вам понадобится процесс обслуживания, который удаляет мертвые сессии. Затем у вас есть таблица очереди сообщений, в которую клиент может записать обновление с одной строкой для каждого текущего активного сеанса. Затем другие клиенты могут регулярно пропинговать эту таблицу, чтобы увидеть, есть ли какие-либо ожидающие уведомления для ее сеанса, если они есть, они могут прочитать их, воздействовать на них и затем удалять их.
  4. Это был своего рода одноранговый подход, когда клиенты знали друг о друге через информацию в базе данных, а затем они подключались друг к другу напрямую и уведомляли или запрашивали уведомления (в зависимости от конфигурации брандмауэра и NAT). Немного сложнее, но возможно.

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

Для этого вам понадобятся компоненты TIdTCPServer (слушатель) и TIdTCPClient (отправитель). Оба из которых находятся в библиотеках Indy в Delphi.

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

Сервер: http://www.rabbitmq.com/download.html Сделайте Google для клиента или внедрите себя

ура

Компоненты ICS от http://www.overbyte.be/ великолепны. a.) Лучшая совместимость, чем в Indy b.) PostCard ware Хорошие примеры и поддержка. Используйте TClientSocket и TServerSocket

Проект FirebirdSQL использует концепцию уведомлений как соединения сервер-клиент, которые отправляют строку клиенту. Для этого сервер БД использует другой порт. И требовать от клиента регистрации, интересно получать определенный тип уведомлений через вызов API.

Вы могли бы использовать ту же идею.

Вы должны иметь возможность использовать Multicast UDP для той же цели. Единственным отличием будет присоединение к многоадресной группе от каждого клиента.

http://en.wikipedia.org/wiki/IP_Multicast

http://en.wikipedia.org/wiki/Internet_Group_Management_Protocol

Изменить: просто чтобы уточнить, многоадресная рассылка позволяет вам присоединиться к данной "группе", связанной с многоадресным IP-адресом. Любой пакет, отправленный на этот адрес, дойдет до каждого клиента, присоединившегося к группе.

Вы можете наблюдать за компонентом weonlydo wodVPN, который позволяет вам создать надежную пробивку UDP-дырок и получить переадресацию портов или обычный VPN (с устаревшим сетевым адаптером), чтобы вы могли подключить два компьютера за NAT.

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

Другие вопросы по тегам