Обмен данными между двумя приложениями через ПК в локальной сети

Мне нужно реализовать два приложения, которые будут обмениваться данными друг с другом. Оба приложения будут работать на отдельных компьютерах, входящих в локальную сеть.

Как мы можем это сделать в Delphi?

Есть ли какой-нибудь бесплатный компонент, который упростит обмен данными между приложениями на ПК?


person Yogi Yang 007    schedule 10.08.2009    source источник


Ответы (10)


Если я пишу это сам, я (почти) всегда использую сокеты для обмена данными между приложениями.

Он легкий, он хорошо работает на одном компьютере, в локальной сети или в Интернете без каких-либо изменений и позволяет вам общаться между приложениями с разными разрешениями, такими как службы (здесь сообщения Windows вызывают проблемы).

Возможно, это не требование для вас, но я также поклонник независимого от платформы транспорта, такого как TCP / IP.

Есть много бесплатных вариантов для Delphi. Вот некоторые из них, о которых я знаю. Если вам нравится блокировать библиотеки, посмотрите Indy или Synapse. Если вы предпочитаете неблокирование, попробуйте ICS.

person Bruce McGee    schedule 10.08.2009
comment
Извините за мое незнание, но что такое "Блокирующий" и "Неблокирующий"? Я никогда не сталкивался с этими терминами даже после 15+ лет программирования. Фактически, я никогда не сталкивался с таким требованием до настоящего времени. Это первый раз, когда клиент запросил средство, которое позволит нашим приложениям, работающим на разных компьютерах, обмениваться данными между ними. Я действительно планировал внедрить DCOM, но дело в том, что использование COM в Delphi - это чистая боль в ... - person Yogi Yang 007; 10.08.2009
comment
У меня был очень плохой опыт работы с DCOM еще в оригинальном MIDAS, который использовал DCOM в качестве транспорта по умолчанию. Если вы решили попробовать, сначала проведите небольшое расследование. Блокирующие вызовы останавливают выполнение кода до завершения вызова. Для интерактивных приложений их следует использовать в потоках. Неблокирующие вызовы немедленно возвращают управление и уведомляют вас о событии, когда вызов завершен. У обоих есть свои преимущества и недостатки. - person Bruce McGee; 10.08.2009
comment
COM в Delphi, вероятно, является самым простым способом использования COM, но обычно это не лучший способ работы в сети. Блокирование и неблокирование относятся к тому, как операционная система обрабатывает поток, который инициирует ввод-вывод (заблокированный поток или процесс не планируется запускать до тех пор, пока он не будет разблокирован). Блокирование ввода-вывода вызывает незапланирование потока планировщиком ОС до завершения ввода-вывода. Неблокирующий ввод-вывод не блокирует поток, поток продолжает работать, но для уведомления о завершении необходимо использовать обратный вызов, опрос или другой механизм. - person Barry Kelly; 10.08.2009

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

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

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

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

Критичность - как долго полученное сообщение может оставаться без присмотра, прежде чем оно будет переполнено более поздним сообщением? (Обычно это не важно, если пропускная способность не высока, а хранилище сообщений ограничено.)

После того, как вы ответите на эти вопросы, вы можете начать спрашивать, какая технология лучше всего подходит для вашей конкретной ситуации.

-Al.

person A. I. Breveleri    schedule 10.08.2009
comment
+1, хотя я бы добавил критичности: можно ли разрешить получение сообщений не по порядку или даже полное удаление? - person mghie; 11.08.2009
comment
Сообщения обычно имеют размер 10 Кбайт в любой момент времени. Все сообщения будут сохранены в собственном формате, совместимом со сторонним программным обеспечением для статистического анализа. - person Yogi Yang 007; 11.08.2009
comment
Отличный момент - я добавлю упорядоченность и надежность к своей концепции критичности. -Ал. - person A. I. Breveleri; 12.08.2009

Раньше я использовал почтовые ящики, если мне нужно было взаимодействовать более чем с одним ПК одновременно («широковещательная рассылка») по сети, хотя есть предостережение, что почтовые ящики не гарантируются.

Для 1-к-1 именованные каналы - это способ сортировки Windows, вы в основном открываете канал связи между двумя компьютерами, а затем записываете сообщения в канал. Непросто начать, но очень надежный и рекомендуемый способ для таких вещей, как службы Windows.

MS предлагает именованные каналы в качестве альтернативного способа связи с SQL Server (кроме TCP / IP).

Но, как сказал Брюс, TCP / IP является стандартным, независимым от платформы и очень надежным.

person J__    schedule 10.08.2009
comment
И почтовые ящики, и именованные каналы используют TCP / IP для связи между машинами и являются жизнеспособными вариантами протокола между приложениями в одной сети. - person skamradt; 10.08.2009

DCOM раньше был хорошим методом межпроцессного взаимодействия. Это также было одной из сильных сторон Delphis. Сегодня я бы настоятельно посоветовал не использовать его.

В зависимости от характера вашего проекта я бы выбрал либо

  • с использованием SQL-сервера
  • связь через сокет
person Martin Liesén    schedule 10.08.2009
comment
DCOM устарел, и у меня много проблем с его использованием. Он даже отключен в более новой версии Windows Server AFAIK. - person Arnaud Bouchez; 11.11.2011

Посмотрите на решения, использующие интерфейсы типа «Удаленный вызов процедур». Я использую RemObjects SDK для такого рода вещей, но есть версии с открытым исходным кодом RealThinClient, который также подойдет.

Оба они позволяют вам создать соединение, которое для большей части вашего кода является «прозрачным», и вы просто вызываете интерфейс, который отправляет данные по сети и возвращает результаты. Затем вы можете запрограммировать, как обычно, и забыть детали сокетов и т. Д.

person mj2008    schedule 10.08.2009
comment
Из того, что я прочитал, RealThinClient бесплатен только для разработки. Какова реальная картина о RTC? - person Yogi Yang 007; 11.08.2009
comment
Проверьте статус с помощью RTC. Я думаю, что это похоже на MySQL в том, что есть более старые версии, которые открыты, а текущая является платной. Для меня RemObjects SDK стоит платить - он очень гибкий. - person mj2008; 12.08.2009

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

Если ваше общение не зависит от времени или критично, тогда может быть достаточно простого опроса базы данных или файла через регулярные промежутки времени. Если ваша коммуникация критична и чувствительна ко времени, возможно, стоит заняться размещением TCPIP-сервера на каждом клиенте. Если только чувствительны ко времени, то почтовые ящики - хороший выбор, если критично, но не чувствительны ко времени, то именованные каналы.

person skamradt    schedule 10.08.2009

Я использовал многоадресные компоненты библиотеки Indy (IdIPMCastClient / Server) для этого типа вещь много раз. Приложения просто отправляют друг другу XML. Быстро и легко с минимальными требованиями к подключению.

person Community    schedule 10.08.2009

Вероятно, самый простой способ - это прочитать и записать файл (или, возможно, один файл в каждом направлении). Он также имеет то преимущество, что его легко моделировать и отслеживать. Однако это не самый быстрый вариант (и это определенно звучит неубедительно ;-)).

person dummzeuch    schedule 10.08.2009
comment
Одновременный доступ к файлу по сети совершенно небезопасен. Совершенно безопасно, если контент доступен только для чтения. Но если вы хотите, чтобы файл был изменен, это не лучшая идея. Из-за сетевого взаимодействия вы никогда не можете быть уверены, что файл заблокирован, даже если используете соответствующие API Windows. Отладка может быть кошмаром. - person Arnaud Bouchez; 11.11.2011

Возможна возможность «совместного использования» объектов по сети.

Это возможно с клиент-серверной ORM, такой как наш маленький mORMot.

Эти библиотеки с открытым исходным кодом работают от Delphi 6 до XE2 и используют JSON для передачи. Включены некоторые функции безопасности (включая RESTful-аутентификацию механизм) и может использовать любую базу данных - или вообще не использовать базу данных.

См., В частности, первые четыре предоставленных образца и соответствующую документацию.

person Arnaud Bouchez    schedule 11.11.2011

Для интеграции приложений Delphi можно использовать промежуточное ПО, ориентированное на сообщения. Брокеры сообщений предлагают гарантированную доставку, балансировку нагрузки, различные модели взаимодействия, работают как на разных платформах, так и на разных языках. Брокеры сообщений с открытым исходным кодом включают:

(Заявление об ограничении ответственности - я являюсь автором клиентских библиотек Delphi / Free Pascal для этих серверов)

person mjn    schedule 11.08.2009
comment
Программное обеспечение никогда не будет иметь более 4 ПК в локальной сети, так что это никогда не проблема. Я не хочу использовать для этого сервер. Использование сервера похоже на вызов слона, чтобы тот взял ветку! Спасибо за предложения. - person Yogi Yang 007; 11.08.2009