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

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

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

有帮助吗?

解决方案

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

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

其他提示

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

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

显然,实施的选择将取决于您的设置和需求。为了达到最佳效果,需要进行调整。

为此您需要的组件是 TIdTCP服务器 (听众)和 TIdTCP客户端 (发件人)。两者都在 Delphi 的 Indy 库中。

ICS 组件来自 http://www.overbyte.be 都很棒。a。)比Indy b。)明信片商品的好例子和支持。使用 TClientSocket 和 TServerSocket

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

你可以使用同样的想法。

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

服务器: http://www.rabbitmq.com/download.html为客户谷歌一下或者自己实现

干杯

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top