我需要实现两个可以互相交换数据的应用程序。这两个应用程序都将在作为局域网一部分的独立PC上运行。
我们如何在Delphi中做到这一点?
是否有任何免费组件可以轻松在PC上的应用程序之间交换数据?
答案 0 :(得分:11)
如果我自己编写,我(几乎)总是使用套接字在应用程序之间交换数据。
它重量轻,可以在同一台机器上,在本地网络或Internet上运行良好,无需更改,它可以让您在具有不同权限的应用程序之间进行通信,例如服务(Windows消息会导致此处出现问题)。
这可能不是你的要求,但我也是平台无关传输的粉丝,比如TCP / IP。
Delphi有很多免费选择。以下是我所知道的一些内容。如果您想要阻止库,请查看Indy或Synapse。如果您不喜欢非阻止,请查看ICS。
答案 1 :(得分:4)
在选择技术之前,您应该根据其吞吐量,粒度,延迟和关键性来表征通信。
吞吐量 - 您需要移动多少单位时间的数据?可能值的范围非常广泛,以至于最低速率和最高速率的应用几乎没有任何共同点。
粒度 - 消息有多大?接收应用程序在使用该消息之前需要多少数据?
延迟 - 当一个应用程序发送消息时,其他应用程序必须多久才能看到它?您希望接收应用程序对发送应用程序做出多快反应?
重要性 - 收到的消息在被后续消息超出之前可以无人值守多长时间? (除非吞吐量很高且消息存储有限,否则这通常不重要。)
一旦您回答了这些问题,您就可以开始询问适合您特定情况的最佳技术。
-Al。
答案 2 :(得分:3)
如果我需要通过网络一次与多台PC(“广播”)进行通信,我曾经使用Mailslots,尽管有一点需要注意,邮件槽不能得到保证。
对于1对1,命名管道是Windows做这种事情的方式,你基本上打开2台PC之间的通信通道,然后将消息写入管道。不是直接的开始,但非常可靠和推荐的方式,如Windows服务。
MS提供命名管道作为与SQL Server(TCP / IP除外)通信的替代方式。
但正如布鲁斯所说,TCP / IP是标准的,与平台无关,而且非常可靠。
答案 3 :(得分:3)
DCOM曾经是一种很好的进程间通信方法。这也是Delphis的一个强点。今天我会强烈建议不要使用它。
根据项目的性质,我选择
答案 4 :(得分:1)
查看使用“远程过程调用”类型接口的解决方案。我使用RemObjects SDK来做这类事情,但有RealThinClient的开源版本也可以这样做。
这两个允许您创建一个连接,大多数代码都是“透明”的,您只需调用一个通过线路发送数据并获得结果的接口。然后,您可以编写通常的编程方式,并忘记套接字的详细信息等。
答案 5 :(得分:1)
这是确实没有“最佳”答案的情况之一,因为几乎所有已经讨论过的技术都可用于在两个应用程序之间进行准确通信。选择使用哪种方法实际上可以归结为通信的关键性质,以及必须将数据从一个工作站传输到另一个工作站。
如果您的通信不是时间敏感或关键,那么定期对数据库或文件进行简单轮询就足够了。如果您的通信是关键且时间敏感的,那么在每个客户端放置TCPIP服务器可能是值得追求的。如果只是时间敏感,那么邮件邮件是一个很好的选择,如果关键但不是时间敏感的,那么命名管道。
答案 6 :(得分:1)
我已经多次使用Indy库的多播组件(IdIPMCastClient / Server)来处理这种类型的事情。应用程序只是相互发送XML。快速简便,连接要求极低。
答案 7 :(得分:0)
可能最简单的方法是读取和写入文件(或者每个方向可能有一个文件)。它还具有易于模拟和跟踪的优点。虽然这不是最快的选择(而且肯定听起来很蹩脚;-))。
答案 8 :(得分:0)
对于Delphi应用程序集成,message oriented middleware可能是一个选项。消息代理提供有保证的交付,负载平衡,不同的通信模型,并且它们可以跨平台和跨语言工作。开源消息消息代理包括:
(免责声明 - 我是这些服务器的Delphi / Free Pascal客户端库的作者)
答案 9 :(得分:0)
可能是通过网络“共享”对象。
可以使用像little mORMot这样的客户端服务器ORM。
这个开源图书馆的工作从Delphi 6到XE2,并使用JSON进行传输。包含一些安全功能(涉及RESTful authentication mechanism),可以使用任何数据库 - 或者根本不使用数据库。
特别参见first four samples provided和相关文档。