【问题标题】:Asynchronous Communication Between Two Applications两个应用程序之间的异步通信
【发布时间】:2010-09-19 13:04:20
【问题描述】:

我正在为我的孩子们写一个简单的小游戏——它做什么并不重要,虽然我不能告诉你,因为我/他们还没有完全决定!但是,我认为它将有一个服务器组件和许多客户端组件,并且我正在研究客户端可以与服务器通信的方式。

我以前的所有经验……事实上,我的整个职业生涯……都涉及到服务器元素,要么是数据库,要么是 Web 服务器,要么是两者的结合。在这种情况下两者都不合适,所以我很好奇我可以和应该使用什么方法在两者之间进行通信。

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

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

我故意对这些应用程序的用途含糊其辞;我希望客户端会向服务器宣布他们的存在,将用户的选择提供给服务器,作为回报,服务器将定期更新客户端,了解更广泛的游戏中发生的事情。游戏将是回合制而非实时游戏……而且技术含量非常低!

建议?理想情况下,如果有任何已知的良好学习资源的链接。

结论: 我实际上认为可能有更多可行的选择;有 Remoting(现已弃用),但一致认为 WCF 是要走的路——就我而言,自托管看起来很有吸引力。

感谢您的回复。

【问题讨论】:

    标签: c# wcf communication messaging


    【解决方案1】:

    您似乎对 WCF 感兴趣,在这种情况下使用 WCF 是一种合理的技术。

    在编写网络游戏时,最简单的方法是在这里也使用客户端服务器方法。使用 WCF,您有一些不同的托管可能性,在 IIS 中托管或自托管。我会选择自助托管,以避免在您的家用计算机上安装 IIS。

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

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

    我建议将服务部分分离到一个单独的项目中,然后如果您愿意,以后可以轻松地将服务分解为 Windows 服务。

    编辑2:
    顺便说一句,由于 WCF 是由来自客户端的调用驱动的,因此您需要轮询服务器以进行更改。您可以在 Google 上搜索 wcf long pollinglong polling,了解将消息从服​​务器“推送”到客户端的方法。

    【讨论】:

    • 不需要任何预安装的软件或服务(例如 IIS 等)是一个先决条件(抱歉,应该是明确的)。当然除了 .NET Framework!不确定游戏服务器是否可以托管 WCF 服务...如果可能的话,更喜欢它在游戏中运行 - 希望它对主机的侵入性尽可能小。
    • @CJM:我用描述如何自托管 WCF 服务的链接更新了我的答案,这应该可以帮助您入门。
    • Albin - 感谢关于自托管的链接 - 我认为这看起来不错。
    • 好评论,但不管是否需要“轮询”都不是真的——你只需要混合一个双工服务。
    • @Kirk - 谢谢。我刚刚开始研究双工服务,它看起来很有希望。
    【解决方案2】:

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

    我过去曾使用过此代码,该项目在本地启动非常简单。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        我不太支持推出自己的解决方案,但对于客户端应用程序之间的简单双向通信而言,WCF 确实是矫枉过正。

        我还没有为 .NET 找到一个好的开源网络库。我知道很多人会加入各种图书馆,但我见过的每一个都是旧的并且有各种缺陷。大多数人似乎是从应用程序中提取他们的库并试图将其打包为通用库的人,但保留了他们应用程序的所有假设。

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

        有人愿意帮助我从头开始构建一个基于 .net 3.5+ 的良好网络库吗?

        【讨论】:

        • 碰巧的是,我的应用不需要长时间保持连接,也不需要跨越防火墙(Windows 内置种类除外)。但我同意你的观点。 WCF 似乎对我有用,但我思想开放,会考虑任何替代方案。
        • 好吧,如果您认为 WCF 会为您工作,那么启动并运行某些东西是相当容易的。但是,要超越样板示例,还有很长的学习曲线。
        • 工作项目通常很匆忙而且计划不周,而且总是需要在昨天完成——在工作中学习全新的东西是很困难的。所以我试着在自己的时间里学会一两个技巧……陡峭的学习曲线 = 最终获得了有价值的知识?
        【解决方案5】:

        如果我是你,我会关注 Remoting。它很容易实现,你肯定可以在工作中使用它。

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

        【讨论】:

        • Remoting 是老派,应该使用 WCF。
        • msdn.microsoft.com/en-us/library/kwdt6w2k.aspx 说远程处理已被弃用,WCF 是替代品。
        • 有趣,感谢您的链接。我更多的是考虑点对点两个桌面的情况,但我会看看 WCF :)。
        猜你喜欢
        • 1970-01-01
        • 2016-07-27
        • 2011-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-06
        • 1970-01-01
        相关资源
        最近更新 更多