两个应用程序之间的异步通信

时间:2010-09-19 13:04:21

标签: c# wcf communication messaging

我正在为我的孩子们写一个简单的小游戏 - 它的作用并不重要,但我无论如何也无法告诉你,因为我/他们还没有完全决定!但是,我认为它将有一个服务器组件和许多客户端组件,我正在研究客户端可以与服务器通信的方式。

我之前的所有经历......事实上我的整个职业生涯都涉及服务器元素,无论是数据库,Web服务器,还是两者串联。在这种情况下都不合适,所以我很好奇我能做什么?应该用来在两者之间进行沟通。

显然,最好采用我可以在我的工作中重复使用的技术或技术,我正在越来越多地使用Windows Forms。我想我可以采用1001种不同的方法;这是一个从谷壳中分拣小麦的问题。

我刚刚开始阅读有关WCF的内容,但目前还不清楚,如果这种面向服务的方法是我正在寻找的。

我故意模糊了申请会做什么;我希望客户端会向服务器宣布他们的存在,将用户选择提供给服务器,作为回报,服务器将定期更新客户端与更广泛的游戏中发生的事情。游戏将基于回合而不是实时......而且真的很低技术!

连连呢?理想情况下,如果知道任何知识,可以链接到良好的学习资源。

结论: 我实际上认为可能有更多可行的选择; Remoting(现已被删除),但共识认为WCF是可行的方式 - 在我看来,自托管看起来很有吸引力。

感谢您的回复。

6 个答案:

答案 0 :(得分:3)

看起来你对WCF感兴趣,这是一种在这种情况下使用的合理技术。

编写网络游戏时,最简单的方法是在此处使用客户端服务器方法。使用WCF,您可以拥有一些不同的托管可能性,在IIS中托管或自托管。我会去自我托管,以避免在家用电脑上使用IIS。

该服务可以托管在Windows服务中,也可以托管在其中一个客户端中。我建议作为Windows服务运行。该服务可以在与其中一个客户端相同的机器上运行。

修改
如果要在其中一个客户端托管服务器,可以提供一个菜单选项“启动服务”,在该计算机上启动self hosted服务(并自动将客户端部分连接到localhost)。服务启动后,您可以显示您在“其他”计算机上输入的计算机名称以进行连接。

我建议将服务部分分成一个单独的项目,如果你愿意,可以稍后轻松地将服务分解为Windows服务。

<强> EDIT2:
顺便说一句,由于WCF是由来自客户端的调用驱动的,因此您需要轮询服务器以进行更改。您可以使用Google wcf long pollinglong polling来获取将邮件从服务器“推送”到客户端的方法。

答案 1 :(得分:2)

查看有关使用WCF创建聊天应用程序的文章 - http://www.codeproject.com/KB/IP/WCFWPFChatRoot.aspx

我过去曾经使用过这段代码,而且该项目在本地推出非常简单。

答案 2 :(得分:1)

Here是一本关于WCF的好书,可以帮助您入门。它有相当多的学习曲线(我自己几乎没有触及表面),但我感觉这是一种非常强大的方式来设置基于服务的应用程序。在我链接的页面上,查看示例链接,其中包括本书中的一堆代码,包括Juval的ServiceModelEx,它有各种有用的类来处理WCF。

答案 3 :(得分:1)

我要在这里反对人群并建议不要使用WCF。 WCF是面向服务架构的一项伟大技术,但它主要是基于客户端不会保持与服务器连接,而是连接,发送消息,可能接收结果和断开连接的想法。

有一种机制可用于长连接客户端,但坦率地说,它不能很好地工作,有各种问题和怪癖,并且在了解客户端何时断开连接方面不是很可靠,或客户是否知道他们是否仍然连接到服务器。它更像是一个试图将自己变成WCF模型的解决方案。

另一个问题是防火墙之一。启动器和接收器之间不能有防火墙(或者必须有一个开放端口)。这意味着您不能轻易地在防火墙后面拥有两个想要相互通信的客户端。您需要某种公开的中间服务器。虽然此问题适用于所有解决方案,但使用直接TCP连接比使用WCF更容易管理。

我不是推动您自己的解决方案的巨大支持者,但WCF对于客户端应用程序之间的简单双向通信实际上是过度的。

我还没有找到一个很好的.NET开源网络库。我知道很多人会和各种图书馆联系,但我见过的每一个人都很老,有各种各样的缺陷。大多数人似乎都是从应用程序中删除他们的库并尝试将其打包为通用应用程序的人,但留下了他们应用程序的所有假设。

问题是最新版本的.NET增加了许多新的网络功能,特别是在异步支持方面。到目前为止,我还没有看到任何实现这些功能的库。

任何人都希望帮助我从头开始构建基于.net 3.5 +?

的优质网络库

答案 4 :(得分:0)

如果我是你,我会看Remoting。这很容易实现,你可以在工作中明确地使用它。

这里有一个教程: http://generally.wordpress.com/2007/05/31/a-simple-remoting-example-in-c/

答案 5 :(得分:0)

您还可以考虑使用Eneter Messaging Framework通过消息进行通信。 该框架非常轻巧,易于使用,并支持各种通信方案(单向通信,请求 - 响应,发布 - 订阅......)。它可以通过命名管道,Tcp或Http进行通信,也可以用于线程之间的通信。

如果您有兴趣,可以查看link text