Delphi网络编程
我有一个用Delphi 2006编写的经典客户端/服务器(胖客户端和数据库)程序。当客户端中满足某些条件时,我需要非常快地通知所有其他客户端。到目前为止,已经使用UDP广播完成了此操作,但这不再可行,因为客户端现在从LAN外部进行连接,并且UDP广播仅限于本地网络。
我知道Indy库,但实际上不确定要使用哪些组件以及如何构建它。我猜我需要一个客户端连接到的服务器,该服务器将接收和分发消息...?有任何样本可以帮助我入门吗?
还有其他我应该考虑的其他组件集或者技术吗?
解决方案
回答
我们应该能够出于相同的目的使用多播UDP。唯一的区别是将从每个客户端加入多播组。
http://en.wikipedia.org/wiki/IP_Multicast
http://en.wikipedia.org/wiki/Internet_Group_Management_Protocol
编辑:只是为了澄清,多播使我们可以加入与多播ip地址关联的给定"组"。发送到该地址的任何数据包都将到达加入该组的每个客户端
回答
简单的答案是,Delphi(和其他工具)中可用的标准协议不允许反向通知。我在一个我想使用SOAP的项目中进行了调查。他们都假设客户端请求服务器,服务器做出响应,仅此而已。
对我来说,解决方案是RemObjects SDK。这使我们可以将通知发送到客户端,并且通知可以包含我们喜欢的任何数据(就像客户端到服务器一样)。我自己使用的是SuperTCP连接,但它也可以与其他人一起使用。它仍然可以为必须使用它的客户端提供一个SOAP接口,但是对于我们可以同时控制客户端和服务器的地方,它工作得非常好。
回答
尽管我确信RemObjects SDK也可以很好地工作,但是有几种使用Delphi的简单方法。
- 有一个中央服务器,上面有一个* TIdTCPServer侦听*。然后,每个客户端上都有一个TIdTCPClient。它们连接到服务器并阻塞读取,以等待服务器写入。服务器通过侦听套接字接收到通知后,将广播到每个等待的客户端。这几乎是所有客户的立即通知。
- 拥有一个正在监听TIdTCPServer的中央服务器。然后,每个客户端上都有一个TIdTCPClient。这些客户端可以" ping"服务器以定期请求更新(使用会话令牌维护状态)。间隔的频率决定了通知的速度。当其中一个客户端需要通知其他客户端时,它只是通知服务器。然后,服务器使用消息队列列出所有活动的客户端会话,并为每个会话添加通知。然后,下一次每个客户端进行连接时,它将向其发出通知,并将其从队列中删除。
- 在数据库中维护一个会话表,在该表中,每个客户端都会定期更新它们具有活动会话的信息,并在断开连接时将其自身删除。我们将需要一个维护过程来删除死会话。然后,我们将获得一个消息队列表,客户端可以为每个当前活动会话向其中写入一行更新。然后,其他客户端可以定期对该表执行ping操作,以查看其会话是否有任何待处理的通知,是否可以读取它们,对其执行操作然后将其删除。
- 某种对等方法是客户端通过数据库中的信息相互了解,然后它们直接彼此连接并通知或者请求通知(取决于防火墙和NAT配置)。稍微复杂一点,但可能。
显然,实现的选择将取决于设置和需求。为了获得最佳结果,有必要进行调音。
为此,我们需要的组件是TIdTCPServer(侦听器)和TIdTCPClient(发送器)。两者都在Delphi的Indy库中。
回答
http://www.overbyte.be的ICS组件很棒。
a。)比Indy更好的兼容性
b。)明信片商品
很好的例子和支持。使用TClientSocket和TServerSocket
回答
FirebirdSQL项目使用通知的概念,即通知是服务器-客户端连接,用于将字符串发送到客户端。为此,数据库服务器使用另一个端口。并要求客户端进行注册,这很有趣,可以通过API调用接收某种类型的通知。
我们可以使用相同的想法。