Delphi网络编程

4
我有一个用Delphi 2006编写的传统客户端/服务器(fat client和数据库)程序。当客户端满足某些条件时,我需要非常快速地通知所有其他客户端。到目前为止,这是通过UDP广播完成的,但由于客户端现在从局域网外部连接,因此UDP广播不再可行。
我知道Indy库,但不确定要使用哪些组件以及如何构建它。我猜我需要一个服务器,客户端连接到该服务器,该服务器将接收并分发消息...?有没有示例可以帮助我入门?
还有其他组件集或技术应该参考吗?
7个回答

4
简单的回答是,Delphi(以及其他工具)中提供的标准协议不支持反向通知。在我为想使用SOAP的项目中进行了研究后得出这个结论。它们都假定客户端请求服务器,服务器响应并结束。对于我来说,解决方案是RemObjects SDK。这使您能够向客户端发送通知,而通知可以有任何您喜欢的数据(就像客户端到服务器)。我自己使用SuperTCP连接,但它也适用于其他连接方式。它仍然可以为必须使用SOAP的客户端提供接口,但对于您可以控制客户端和服务器的情况,它非常有效。

1
它们确实允许反向通知,只是因为需要已经建立连接或定期检查通知,所以不是显而易见的。 - Jim McKeeth

2
有几种使用Delphi实现的简单方法可以实现此功能,尽管我相信RemObjects SDK也能很好地完成这项工作。
  1. 有一个中央服务器,其中* TIdTCPServer监听*。然后每个客户端都有一个TIdTCPClient。它们连接到服务器并阻塞读取等待服务器写入。一旦服务器通过监听套接字收到通知,它将向每个等待的客户端进行广播。这几乎是所有客户端的立即通知。
  2. 有一个中央服务器,其中有一个TIdTCPServer监听。然后每个客户端都有一个TIdTCPClient。这些客户端可以"ping"服务器以定期请求更新(使用会话令牌来维护状态)。间隔频率决定通知速度。当其中一个客户端需要通知其他客户端时,只需通知服务器即可。然后服务器使用消息队列列出所有活动客户端会话并添加每个通知。然后每个客户端下次连接时将给出通知并从队列中删除。
  3. 在数据库中维护一个会话表,其中每个客户端定期更新其自己的活动会话,并在断开连接时将其自身删除。您将需要一个维护过程来删除死会话。然后您有一个消息队列表,客户端可以向其中写入更新,并为每个当前活动会话添加一行。然后其他客户端可以定期ping该表以查看其会话是否有任何待处理的通知,如果有,则可以读取它们,对其进行操作,然后将其删除。
  4. 某种点对点方法,其中客户端通过数据库中的信息相互了解,然后直接连接并通知或请求通知(取决于防火墙和NAT配置)。稍微复杂一些,但可能性依然存在。
显然,实现的选择取决于您的设置和需求。需要调整以实现最佳结果。
此功能所需的组件是TIdTCPServer(监听器)和TIdTCPClient(发送器)。这两者都在Delphi的Indy库中。

1

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

服务器:http://www.rabbitmq.com/download.html 可以在谷歌上搜索客户端或自行实现

祝好


1
FirebirdSQL项目使用通知的概念作为服务器-客户端连接,向客户端发送字符串。为此,数据库服务器使用另一个端口,并要求客户端通过API调用注册其对接收某种类型通知的兴趣。
您也可以使用相同的想法。

1

http://www.overbyte.be提供的ICS组件非常棒。 a.) 比Indy更兼容 b.) 使用明信片式软件许可证 提供良好的示例和支持。请使用TClientSocket和TServerSocket。


0
您可以使用weonlydo wodVPN组件观看,该组件允许您创建强大的UDP打洞并获得端口转发或普通VPN(带有网络适配器),因此您可以连接位于NAT后面的两台计算机。
我正在为我们的通信程序使用此控件,它运行非常良好。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接