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