Delphi Сетевое программирование - PullRequest
4 голосов
/ 12 сентября 2008

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

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

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

Ответы [ 7 ]

4 голосов
/ 12 сентября 2008

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

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

2 голосов
/ 12 сентября 2008

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

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

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

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

1 голос
/ 21 апреля 2011

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

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

Приветствия

1 голос
/ 19 февраля 2009

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

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

1 голос
/ 15 сентября 2008

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

0 голосов
/ 21 апреля 2011

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

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

0 голосов
/ 12 сентября 2008

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

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

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

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

...