4

我有一个用 Delphi 2006 编写的经典客户端/服务器(胖客户端和数据库)程序。当客户端满足某些条件时,我需要非常快速地通知所有其他客户端。到目前为止,这是使用 UDP 广播完成的,但这不再可行,因为客户端现在从 LAN 外部连接,并且 UDP 广播仅限于本地网络。

我知道 Indy 库,但不确定要使用哪些组件以及如何构建它。我猜我需要有一个客户端连接到的服务器来接收和分发消息......?有什么样品可以让我开始吗?

是否还有其他我应该考虑的组件集或技术?

4

7 回答 7

4

简单的答案是 Delphi(和其他工具)中可用的标准协议不允许反向通知。我研究了一个我想使用 SOAP 的项目。他们都假设客户端询问服务器,服务器响应,仅此而已。

对我来说,解决方案是 RemObjects SDK。这允许您向客户端发送通知,并且通知可以包含您喜欢的任何数据(就像客户端到服务器一样)。我自己使用 SuperTCP 连接,但它也适用于其他人。它仍然可以为必须使用它的客户端提供 SOAP 接口,但是对于您可以同时控制客户端和服务器的地方,它工作得非常好。

于 2008-09-12T10:36:00.727 回答
2

使用 Delphi 有一些非常简单的方法可以做到这一点,尽管我确信 RemObjects SDK 也能很好地工作。

  1. 有一个中央服务器,上面有一个 * TIdTCPServer 监听 *。然后每个客户端都有一个TIdTCPClient。它们连接到服务器并阻塞 等待服务器写入的读取。一旦服务器通过侦听套接字接收到通知,它就会向每个等待的客户端广播。这几乎是所有客户的即时通知。
  2. 有一个中央服务器,上面有一个TIdTCPServer 正在侦听。然后每个客户端都有一个TIdTCPClient。这些客户端可以“ping”服务器以定期请求更新(使用会话令牌来维护状态)。间隔的频率决定了通知的速度。当其中一个客户端需要通知其他客户端时,它只通知服务器。然后,服务器使用消息队列列出所有活动的客户端会话,并为每个会话添加通知。然后下次每个客户端连接时,它都会向它发出通知并将其从队列中删除。
  3. 在数据库中维护一个会话表,每个客户端都会定期更新他们有一个活动会话,并在断开连接时将其自身删除。您将需要一个删除死会话的维护过程。然后,您有一个消息队列表,客户端可以为每个当前活动会话写入一行更新。然后其他客户端可以定期 ping 该表以查看其会话是否有任何待处理的通知,如果有,它可以读取它们,对它们进行操作,然后删除它们。
  4. 某种对等方法是客户端通过数据库中的信息相互了解,然后它们直接相互连接并通知或请求通知(取决于防火墙和 NAT 配置)。稍微复杂一点,但可能。

显然,实施的选择将取决于您的设置和需求。调整将是必要的,以获得最佳结果。

为此,您需要的组件是TIdTCPServer(侦听器)和TIdTCPClient(发送器)。两者都在 Delphi 的 Indy 库中。

于 2008-09-12T17:24:16.270 回答
1

http://www.overbyte.be的ICS 组件很棒。a.) 比 Indy 更好的兼容性 b.) PostCard ware 很好的例子和支持。使用 TClientSocket 和 TServerSocket

于 2008-09-15T18:59:56.263 回答
1

FirebirdSQL 项目使用通知的概念作为向客户端发送字符串的服务器-客户端连接。为此,数据库服务器使用另一个端口。并要求客户端注册通过 API 调用接收某种类型的通知是很有趣的。

您可以使用相同的想法。

于 2009-02-18T23:33:42.573 回答
1

RabbitMQ 应该符合您的要求。服务器是免费的,可以使用。您只需要一个客户端来连接、推送/发送消息和获取/拉取通知消息

服务器:http ://www.rabbitmq.com/download.html 做一个google客户端或者自己实现

干杯

于 2011-04-20T22:33:32.820 回答
0

您应该能够将多播 UDP 用于相同目的。唯一的区别是从每个客户端加入多播组。

http://en.wikipedia.org/wiki/IP_Multicast

http://en.wikipedia.org/wiki/Internet_Group_Management_Protocol

编辑:澄清一下,多播让您加入与多播 IP 地址关联的给定“组”。发送到该地址的任何数据包都将到达已加入该组的每个客户端

于 2008-09-12T10:28:15.490 回答
0

您可以观看 weonlydo wodVPN 组件,该组件允许您创建强大的 UDP 打孔并获得端口转发或普通 VPN(带有完善的网络适配器),因此您可以在 NAT 后面连接两台 PC。

我将这个控件用于我们的通信程序并且工作得很好。

于 2011-04-20T21:32:40.220 回答