服务器应该如何向富客户端推送数据
Posted
技术标签:
【中文标题】服务器应该如何向富客户端推送数据【英文标题】:How should server push data to rich client 【发布时间】:2009-04-20 08:02:14 【问题描述】:我正在编写一个简单的会计程序,该程序由几个 C# winform 客户端和一个可将数据读/写到数据库中的 java 服务器应用程序组成。其中一项要求是所有 C# 客户端都应从服务器接收更新。例如,如果用户 a 从他的 C# 客户端创建新发票,其他用户应该从他们的客户端看到这个新发票。
我的经验主要是 Web 开发,我不知道用 C#s 客户端和 Java servlet 服务器满足这一要求的最佳方法是什么。
我最初是使用 Glassfish 运行 ActiveMQ 并使用消息传递 pub/sub 方法,以便可以将更新推送到 C# 客户端。我将创建不同的主题,如 newInvoice、cancelInvoice 等,以区分消息类型。每条消息将只包含以 JSON 编码的对象。
但在我看来,这涉及到相当多的工作。鉴于我的用户群非常小(只有 3 或 4 个并发用户),在我看来应该有一些更简单的解决方案。 (我不熟悉套接字编程:))
我知道这是一个客户端-服务器编程 101 问题,但如果任何有经验的程序员可以为我指出一些简单的解决方案,那就太好了。
【问题讨论】:
【参考方案1】:这里最简单的方法通常是简单地使用轮询 - 即让客户端每隔(您的时间间隔)查询数据。这避免了一系列问题(防火墙、安全性、视线、分辨率、客户端跟踪等)。
使用 WCF,您可以在双工通道上进行回调(允许服务器主动向客户端发送消息),但这更复杂。我看重简单,所以我通常只是投票。
帮助这里的技巧是将系统设计为具有用于查询“自 x 以来的更改”的内置机制 - 例如,可能由数据库触发器提供的审计表。当然,具体细节因项目而异。
您可能想要查看的另一个选项是 ADO.NET 同步服务;这可以满足您的大部分要求,以使数据库的本地副本与服务器保持最新 - 但它本身具有一些复杂性。这在“本地数据库缓存”VS 模板中可用 (IIRC)。
【讨论】:
【参考方案2】:与其将信息从服务器推送到 1:N 客户端,让客户端每隔一段时间轮询服务器以获取更新不是更容易吗?或者当客户端启动并创建到服务器的连接时,服务器可以为该客户端连接动态生成一个新的消息队列,然后客户端可以轮询更新?
【讨论】:
【参考方案3】:您可以使用多种推送技术,例如 ActiveMQ(如您所提到的)或 XMPP。但是,如果您只需要关心 3 或 4 个客户,那么轮询将是最简单的解决方案。它不能很好地扩展,但这并不是你真正关心的问题,除非你的服务器是 8086 或 8-)
【讨论】:
【参考方案4】:您可能想看看StreamHub Push Server - 它是一种流行的用 Java 编写的 Comet 服务器,它有一个 .NET 客户端 SDK,用于从 C# 中的服务器接收更新。它还具有 Java 客户端 SDK 和通常的 Ajax/Comet Web 浏览器支持,让您在未来将数据推送到 Web、Java 和 C# 客户端时具有更大的灵活性。
【讨论】:
以上是关于服务器应该如何向富客户端推送数据的主要内容,如果未能解决你的问题,请参考以下文章