7

我需要实现两个相互交换数据的应用程序。这两个应用程序将在属于 LAN 的不同 PC 上运行。

我们如何在 Delphi 中做到这一点?

是否有任何免费组件可以轻松地在 PC 之间的应用程序之间交换数据?

4

10 回答 10

11

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

它重量轻,在同一台机器上运行良好,在本地网络或 Internet 上运行良好,无需更改,它允许您在具有不同权限的应用程序之间进行通信,如服务(Windows 消息会导致问题)。

这可能不是您的要求,但我也是独立于平台的传输的粉丝,例如 TCP/IP。

Delphi 有很多免费的选择。以下是我所知道的一些。如果您喜欢阻塞库,请查看IndySynapse。如果您更喜欢非阻塞,请查看ICS

于 2009-08-10T13:22:15.640 回答
4

在选择一种技术之前,您应该根据其吞吐量、粒度、延迟和关键性来表征通信。

吞吐量——单位时间内需要移动多少数据?可能值的范围非常广泛,以至于最低速率和最高速率的应用程序几乎没有任何共同之处。

粒度——消息有多大?接收应用程序需要多少数据才能使用消息?

延迟——当一个应用程序发送消息时,另一个应用程序必须多久才能看到它?您希望接收应用程序以多快的速度响应发送应用程序?

关键性——收到的消息在被后面的消息覆盖之前可以无人看管多长时间?(这通常并不重要,除非吞吐量很高且消息存储有限。)

一旦你回答了这些问题,你就可以开始询问适合你特定情况的最佳技术。

-阿尔。

于 2009-08-10T19:03:27.510 回答
3

如果我需要通过网络一次与多台 PC 通信(“广播”),我曾经使用 Mailslots,尽管有一个警告,即不能保证 mailslots。

对于 1 对 1,命名管道是一种 Windows 方式来做这种事情,你基本上打开 2 台 PC 之间的通信通道,然后将消息写入管道。不是直接开始,但非常可靠和推荐的方式,如 Windows 服务。

MS 提供命名管道作为与 SQL Server(TCP/IP 除外)通信的另一种方式。

但正如布鲁斯所说,TCP/IP 是标准的和平台独立的,并且非常可靠。

于 2009-08-10T15:32:31.227 回答
3

DCOM 曾经是一种很好的进程间通信方法。这也是德尔福的强项之一。今天我强烈建议不要使用它。

根据您项目的性质,我会选择

  • 使用 SQL 服务器
  • 套接字通信
于 2009-08-10T21:14:12.207 回答
1

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

这两种方法都允许您创建一个对于大多数代码来说都是“透明”的连接,并且您只需调用一个接口,该接口通过线路发送数据并返回结果。然后,您可以按照通常的方式进行编程,而忘记套接字等的详细信息。

于 2009-08-10T14:48:35.720 回答
1

这是真正没有“最佳”答案的情况之一,因为几乎已经讨论过的任何技术都可以用于在两个应用程序之间进行准确通信。选择使用哪种方法实际上取决于您通信的关键性质,以及必须将多少数据从一个工作站传输到另一个工作站。

如果您的通信对时间不敏感或不重要,那么定期对数据库或文件进行简单的轮询可能就足够了。如果您的通信至关重要且时间敏感,那么在每个客户端中放置一个 TCPIP 服务器可能值得追求。如果只是时间敏感,那么邮槽是一个不错的选择,如果关键但对时间不敏感,那么命名管道是一个不错的选择。

于 2009-08-10T18:09:52.687 回答
1

我已经多次将Indy库的多播组件 (IdIPMCastClient/Server) 用于此类事情。这些应用程序只是相互发送 XML。快速简便,连接要求最低。

于 2009-08-10T22:58:53.400 回答
0

可能最简单的方法是读取和写入一个文件(或者每个方向可能一个文件)。它还具有易于模拟和跟踪的优点。不过,这不是最快的选择(而且听起来确实很蹩脚;-))。

于 2009-08-10T13:37:29.333 回答
0

对于 Delphi 应用程序集成,面向消息的中间件可能是一种选择。消息代理提供有保证的交付、负载平衡、不同的通信模型,并且它们跨平台和跨语言工作。开源消息消息代理包括:

(免责声明 - 我是这些服务器的 Delphi / Free Pascal 客户端库的作者)

于 2009-08-11T08:04:57.163 回答
0

一种可能是通过网络“共享”对象。

像我们的小 mORMot这样的客户端-服务器 ORM 是可能的。

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

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

于 2011-11-11T06:55:13.043 回答