在局域网上两个应用程序之间交换数据

7

我需要实现两个应用程序之间的数据交换。这两个应用程序将在局域网中运行在不同的计算机上。

在Delphi中,我们该如何实现呢?

有没有免费的组件可以使跨计算机之间的应用程序数据交换变得更加容易?

10个回答

11

如果我自己编写,我(几乎)总是使用套接字在应用程序之间交换数据。

它很轻便,在同一台计算机、本地网络或互联网上都可以很好地工作,而且可以让你在具有不同权限的应用程序之间进行通信,例如服务(Windows消息在这里会引起问题)。

也许这对您来说并不是必要条件,但我也喜欢平台无关的传输方式,如TCP/IP。

Delphi有很多免费的选择。以下是我了解到的一些。如果你喜欢阻塞库,请查看IndySynapse。如果你喜欢非阻塞,请查看ICS


对不起,我很无知,请问什么是阻塞和非阻塞?即使我已经编程15年以上,我从未听说过这些术语。事实上,直到现在我也从未遇到过这样的需求。这是客户第一次要求提供一个设施,允许我们在不同PC上运行的应用程序之间进行通信和数据交换。我原本计划采用DCOM,但事实是,在Delphi中使用COM纯粹是痛苦的。 - Yogi Yang 007
我在原始的MIDAS时代就有着极差的DCOM使用经验,因为它将DCOM作为默认传输方式。如果你决定尝试它,请先进行一些调查。阻塞调用会停止代码执行,直到调用完成。对于交互式应用程序,应该在线程中使用这些调用。非阻塞调用会立即返回控制权,并在调用完成时通知你事件。两者都有各自的优缺点。 - Bruce McGee
1
在Delphi中使用COM可能是最简单的方法,但通常不是跨网络工作的最佳方式。阻塞和非阻塞与操作系统如何处理启动I/O的线程有关(被阻塞的线程或进程在解除阻塞之前不会被调度运行)。阻塞I/O会导致线程被操作系统调度程序取消调度,直到I/O完成。非阻塞I/O不会阻塞线程,线程继续运行,但需要使用回调、轮询或其他机制来通知完成。 - Barry Kelly

4
在选择技术之前,您应该根据吞吐量、粒度、延迟和重要性对通信进行描述。
吞吐量——您需要每单位时间移动多少数据?可能值的范围非常广,因此最低速率和最高速率的应用程序几乎没有共同点。
粒度——消息有多大?接收应用程序在使用消息之前需要多少数据?
延迟——当一个应用程序发送消息时,另一个应用程序必须多快才能看到它?您希望接收应用程序对发送应用程序做出多快的反应?
重要性——在晚于先前消息的情况下,接收到的消息可以被忽略多长时间? (除非吞吐量很高且消息存储空间有限,否则通常不重要。)
一旦回答了这些问题,您就可以开始寻找适合您的特定情况的最佳技术。
-Al.

+1,不过我想补充一下“关键性”的观点:是否允许接收消息时出现乱序甚至完全丢失的情况? - mghie
消息通常在任何时候都不超过10k字节。所有消息将以专有格式保存,与第三方统计分析软件兼容。 - Yogi Yang 007
非常好的观点mghie - 我会将排序和可靠性加入到我对关键性的概念中。- Al. - A. I. Breveleri

3
我曾经使用邮槽与多台电脑进行网络广播通信,但需要注意的是邮槽并不保证可靠性。
对于一对一的通信,Windows系统提供了命名管道来实现这种功能,您可以在两台计算机之间建立通信通道,然后将消息写入管道。虽然刚开始可能有些复杂,但非常可靠,也是像Windows服务这样的应用程序推荐的方式。
微软还提供了命名管道作为与SQL Server通信的替代方式(而非TCP/IP)。
但正如Bruce所说,TCP/IP是标准和跨平台的,非常可靠。

邮槽和命名管道都使用TCP/IP在机器之间进行通信,并且是同一网络上的应用程序之间可行的协议选项。 - skamradt

3

DCOM曾经是一种很好的进程间通信方法,这也是Delphi的优点之一。但今天我强烈建议不要使用它。

根据您项目的性质,我建议选择以下两种方式之一:

  • 使用SQL服务器
  • 套接字通信

DCOM已经被弃用,我在使用它时遇到了很多问题。据我所知,在较新版本的Windows Server上甚至已被禁用。 - Arnaud Bouchez

1

看看使用“远程过程调用”类型接口的解决方案。我通常使用RemObjects SDK来处理这种情况,但是也有RealThinClient的开源版本可以胜任。

这两个工具都允许您创建一个连接,对于大部分代码而言是“透明”的,您只需调用一个接口即可将数据发送到远程并获取结果。然后您可以像平常一样编程,忘记套接字等细节。


根据我所阅读的,RealThinClient仅限开发免费使用。RTC的真实情况是怎样的呢? - Yogi Yang 007
与RTC核实状态。我认为它类似于MySQL,有“旧”的开放版本和当前需要付费的版本。对我来说,RemObjects SDK是值得付费的 - 它非常灵活。 - mj2008

1

这是其中一种情况,在这种情况下,真正没有一个“最好”的答案,因为已经讨论过的任何技术都可以用于在两个应用程序之间准确通信。选择使用哪种方法将取决于您通信的重要性以及必须从一个工作站传输多少数据。

如果您的通信不是时间敏感或关键性的,则定期对数据库或文件进行简单的轮询可能足以满足需求。如果您的通信很关键且时间敏感,则值得追求在每个客户端中放置TCPIP服务器。如果只是时间敏感,则邮槽是一个很好的选择,如果很关键但不是时间敏感,则命名管道。


1
我曾多次使用Indy库的多播组件(IdIPMCastClient/Server)来完成这种类型的任务。应用程序只需相互发送XML即可,连接要求最小,快速简便。

0

可能最简单的方法是读写一个文件(或者每个方向可能有一个文件)。它的优点是易于模拟和跟踪。然而,它并不是最快的选项(并且听起来肯定很无聊 ;-))。


在网络上并发访问文件是非常不安全的。如果内容只读,那么完全是安全的。但是,如果您想修改文件,则不是一个好主意。由于网络通信,即使使用相应的Windows API,您也无法确定文件是否被锁定。这可能会成为调试的噩梦。 - Arnaud Bouchez

0

软件在局域网中永远不会有超过4台PC,因此这永远不是问题。我不想为此雇用服务器。使用服务器就像叫大象来拿根小枝!感谢建议。 - Yogi Yang 007

0

一个可能的解决方案是通过网络“共享”对象。

使用类似于我们的little mORMot的客户端-服务器ORM,这是可能的。

这个开源库可以在Delphi 6到XE2上运行,并使用JSON进行传输。它包括一些安全功能(涉及RESTful身份验证机制),并且可以使用任何数据库 - 或者根本不使用数据库。

特别是请参阅提供的前四个示例和相关文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接