【发布时间】:2009-08-16 16:50:46
【问题描述】:
我想构建一个客户端/服务器(或三层)类型的 Win32 应用程序,具有以下功能:
- 当“A”客户端对数据库进行修改(更新、插入等)时,查看同一记录集的其他客户端几乎可以“立即”获得该数据的全新视图
- 与数据库的连接丢失时可以通知客户端
有人可以帮我吗?提前致谢
Pdta:我的数据库是 MySQL 5.1
【问题讨论】:
标签: database delphi winapi client-server delphi-2009
我想构建一个客户端/服务器(或三层)类型的 Win32 应用程序,具有以下功能:
有人可以帮我吗?提前致谢
Pdta:我的数据库是 MySQL 5.1
【问题讨论】:
标签: database delphi winapi client-server delphi-2009
请注意,这样做并拥有大量客户端,您可能会获得大量网络流量。 这正是大多数客户端-服务器应用程序不这样做的原因。
如果你真的想这样做,那么正确的做法是实现“观察者模式”; Delphi has been described by Joanna Carter 在她的博客中提供了有关该设计模式的基本示例。
然后您需要扩展该模式,使其在网络上工作。 所以至少你需要一些处理“主题”接口的服务器进程。 您可以为此使用任何东西:WebServices、DataSnap 服务器、RemObjects SDK 等。
大多数人想要这样的解决方案,从传统的客户端/服务器应用程序转变为多层应用程序。然后中间层可以为您处理所有通知。
【讨论】:
我的答案取决于您的网络架构,但我倾向于将 IP 用于此类事情。像多播这样的东西是通知网络上所有客户端事件的理想方式。只需多播或广播 (UDP) 更新记录的 ID 即可。如果另一个客户对该记录感兴趣,它可以从数据库中刷新它。
Indy 多播客户端/服务器组件将提供一种在您的应用中实现此功能的简单方法。
【讨论】:
如果您有一个三层类型的应用程序,客户端将与应用程序服务器通信。此连接可以使用对客户端的回调来通知他们重要事件。 DataSnap 支持回调(afaik 也支持数据更改通知)。
如果您构建自己的应用程序服务器。客户端可以打开到服务器的套接字连接(在一个线程中)并监听事件通知。 Protocols/IdTelnet.pas 中的 Indy Telnet 客户端示例是创建非常简单的通知实现的良好起点。它使用 TIdTelnetReadThread 类来监听服务器对密钥输入和协议协商的响应。
如果您的应用程序需要在终端服务器环境中运行,其中端口不会被虚拟化 AFAIK,从客户端连接到服务器会更安全(而不是打开客户端套接字端口进行对等通信)。
【讨论】:
如果 MySQL 不支持某种推送信息或附加客户端,您将需要使用在服务器上运行的中间层。 该服务器跟踪连接的客户端。但这可能是一项艰巨的工作。
我知道 Delphi 的“更大”版本对构建这种客户端/服务器软件有某种支持。
【讨论】: