我需要实现两个相互交换数据的应用程序。这两个应用程序将在属于 LAN 的不同 PC 上运行。
我们如何在 Delphi 中做到这一点?
是否有任何免费组件可以轻松地在 PC 之间的应用程序之间交换数据?
在选择一种技术之前,您应该根据其吞吐量、粒度、延迟和关键性来表征通信。
吞吐量——单位时间内需要移动多少数据?可能值的范围非常广泛,以至于最低速率和最高速率的应用程序几乎没有任何共同之处。
粒度——消息有多大?接收应用程序需要多少数据才能使用消息?
延迟——当一个应用程序发送消息时,另一个应用程序必须多久才能看到它?您希望接收应用程序以多快的速度响应发送应用程序?
关键性——收到的消息在被后面的消息覆盖之前可以无人看管多长时间?(这通常并不重要,除非吞吐量很高且消息存储有限。)
一旦你回答了这些问题,你就可以开始询问适合你特定情况的最佳技术。
-阿尔。
如果我需要通过网络一次与多台 PC 通信(“广播”),我曾经使用 Mailslots,尽管有一个警告,即不能保证 mailslots。
对于 1 对 1,命名管道是一种 Windows 方式来做这种事情,你基本上打开 2 台 PC 之间的通信通道,然后将消息写入管道。不是直接开始,但非常可靠和推荐的方式,如 Windows 服务。
MS 提供命名管道作为与 SQL Server(TCP/IP 除外)通信的另一种方式。
但正如布鲁斯所说,TCP/IP 是标准的和平台独立的,并且非常可靠。
DCOM 曾经是一种很好的进程间通信方法。这也是德尔福的强项之一。今天我强烈建议不要使用它。
根据您项目的性质,我会选择
查看使用“远程过程调用”类型接口的解决方案。我使用RemObjects SDK来处理这类事情,但是RealThinClient的开源版本也可以。
这两种方法都允许您创建一个对于大多数代码来说都是“透明”的连接,并且您只需调用一个接口,该接口通过线路发送数据并返回结果。然后,您可以按照通常的方式进行编程,而忘记套接字等的详细信息。
这是真正没有“最佳”答案的情况之一,因为几乎已经讨论过的任何技术都可以用于在两个应用程序之间进行准确通信。选择使用哪种方法实际上取决于您通信的关键性质,以及必须将多少数据从一个工作站传输到另一个工作站。
如果您的通信对时间不敏感或不重要,那么定期对数据库或文件进行简单的轮询可能就足够了。如果您的通信至关重要且时间敏感,那么在每个客户端中放置一个 TCPIP 服务器可能值得追求。如果只是时间敏感,那么邮槽是一个不错的选择,如果关键但对时间不敏感,那么命名管道是一个不错的选择。
我已经多次将Indy库的多播组件 (IdIPMCastClient/Server) 用于此类事情。这些应用程序只是相互发送 XML。快速简便,连接要求最低。
可能最简单的方法是读取和写入一个文件(或者每个方向可能一个文件)。它还具有易于模拟和跟踪的优点。不过,这不是最快的选择(而且听起来确实很蹩脚;-))。
对于 Delphi 应用程序集成,面向消息的中间件可能是一种选择。消息代理提供有保证的交付、负载平衡、不同的通信模型,并且它们跨平台和跨语言工作。开源消息消息代理包括:
(免责声明 - 我是这些服务器的 Delphi / Free Pascal 客户端库的作者)
一种可能是通过网络“共享”对象。
像我们的小 mORMot这样的客户端-服务器 ORM 是可能的。
这个开源库的工作范围从 Delphi 6 到 XE2,并使用 JSON 进行传输。包括一些安全功能(涉及RESTful 身份验证机制),并且可以使用任何数据库 - 或根本不使用数据库。
请特别参阅提供的前四个示例以及相关文档。