我应该选择AMQP还是XMPP用于实时基于浏览器的游戏?

6
我正在选择AMQP(RabbitMQ)和XMPP(eJabberd)来制作基于浏览器、无需Flash的JavaScript实时回合制游戏。我对AMQP和XMPP协议不太了解。我想使用PHP进行用户授权和一些与MySQL数据存储相关的操作。据我所知,RabbitMQ有PHP客户端,而eJabberd没有。
我理解的是JavaScript客户端调用PHP脚本并处理必要的操作,然后将数据传递到AMQP或XMPP服务器以传递给对手玩家。有一本很好的书《Pro XMPP Programming with JS and jQuery》来自Wrox,但其中没有PHP示例。因此,以下是我的问题。
1)哪种协议适合我的游戏?
2)我应该选择RabbitMQ仅因为它支持PHP客户端吗?

XAMPP/LAMP等与客户端JavaScript无关。你需要寻找Apache和其他服务器。 - Amy B
2
@Coronatus!感谢您的评论,但我确定您忽略了我的意思。我所说的是可扩展消息和状态协议(XMPP)。 - Devyn
抱歉,我把“XMPP”错认为“XAMPP”了。请忽略我的评论 :) - Amy B
3个回答

9
我在Javascript中使用HTTP Bind方法实现了XMPP客户端,取得了相当不错的成功。对于客户端访问,我喜欢XMPP,但我不了解AMQP。ejabberd已经包含了BOSH支持,为了与Javascript(和可能的Flash)一起使用,您只需要将服务器重定向到配置ejabberd监听HTTP请求的端口即可。(这仅是因为当今浏览器中的Javascript安全模型禁止Javascript请求不同域和甚至不同端口。)由于XMPP是一堆相当平凡的小XML文档,所以在任何选择的语言中对它们进行编码应该非常容易。由于XMPP得到广泛支持,您可能可以避免要求用户注册您的服务,他们肯定会感激。实现XMPP意味着您可以轻松地为游戏添加即时消息支持,并联接到Jabber网络的其他部分(包括Google Talk)。由于我不知道有关AMQP的任何信息,因此无法进行比较,但我可以说为什么我将始终首选XMPP作为我的未来多人游戏项目。

我选择使用ejabberd的个人原因很简单——在Debian上安装和配置都非常容易。虽然对于Erlang和Java我了解甚少,但我知道Erlang有助于轻松实现可伸缩性,而ejabberd的开发者也声称他们做到了。

如果你想进行服务器端逻辑检查,恐怕我不知道有什么好的方法。我会使用代理PHP脚本对传入的XMPP BOSH消息进行合理性检查,然后转发到服务器,而不是直接通过Apache's mod_rewrite 转发。

正如上面提到的,由于XMPP服务器将侦听与“主”Web服务器不同的端口,而Javascript跨域安全模型不允许在不同的端口上执行XMLHTTPRequest,因此肯定需要进行某种形式的代理(使用mod_rewrite或PHP或其他方式)。

因此,在将BOSH请求中继到您选择的XMPP服务器时,合理性检查可能是最容易的。深入挖掘服务器软件可能不是进行此类检查的最佳方法。这可能会花费很长时间,并且可能会使其更难与您的游戏的其余部分集成。

另外,我偶然发现了一个提到XMPP组件和ejabberd模块的答案。这对我来说也是一个有趣的阅读。

祝好运,并且在完成后一定要留下评论并注明游戏名称——我很想看看它 :-)


我刚刚注意到有人发布了一个与你的非常相似的问题。它的答案包含一些更有趣的信息供您参考。

关于使用XMPP和Flash:

你仍然可以使用HTTP绑定(BOSH)与Flash一起使用。实际上,虽然HTTP绑定允许Javascript访问XMPP,但它是为各种应用程序而设计的,例如经常会断开连接的移动连接。

我主要通过观察基于Web的客户端JWChat和ejabberd之间的通信,以及跨平台客户端Psi和ejabberd之间的通信(了解有关协议本身的信息),来弄清如何建立连接。使用JWChat和WebKit的Web Inspector或Firefox的Firebug,可以轻松跟踪向服务器执行的XMLHttpRequests。使用Psi,可以打开XML控制台并阅读通信日志。结合使用您选择的语言原型客户端,学习BOSH和XMPP非常容易。

此外,以下XEP非常有用:XEP-0124XEP-0206

我正在阅读的O'Reilly书籍"XMPP: The Definitive Guide"(作者P. Saint-Andre,Kevin Smith和Remko Tronçon;在苹果应用商店上便宜得多),也让你了解“为什么会这样做”,并记录了许多关于XMPP的小细节和各种应用。
因此,实现基于BOSH的客户端可能会变得相当容易。除了制作一个播放和暂停按钮外,我没有使用Flash进行编码的经验,所以请对此持保留态度 :-)

嗨,感谢您的回复。由于我不懂Erlang语言,我担心在编写带有模块的游戏服务器规则时会遇到问题。您选择Ejabberd而不是基于Java的OpenFire,是否有任何原因?我对Java了解甚少,所以两种语言都不熟悉。 - Devyn
非常感谢您的回复。由于我的游戏需求,JavaScript 已经不够用了,所以我现在正在尝试使用 Flash。然而,我在选择商业套接字服务器(SmartFox、ElectroServer)或者使用 XMPP 之间有些犹豫,因为关于 XMPP 在 Flash 中的示例和教程很少。无论如何,当我能够发布一些东西时,我会第一时间通知您的 :) - Devyn
我会再次编辑答案以提供更多信息。它似乎不适合这个小评论框 :) - Ivan Vučica

1

AMQP目前还没有达到1.0版本,它周围存在一些可能的设计问题。PHP有XMPP客户端,所以如果我是你,我会先尝试一下这个。


1

如有人提到,您需要考虑客户端到服务器部分;那似乎更为重要。

听起来您已经拥有了这个主题上最好的书(Jack Moffit 的 XMPP + JS 书),我肯定会说这是应该采用的技术。

此外,您还可以获得用户身份验证、加密以及所有许多 XMPP 协议扩展,正如书中所描述的那样。

即使我无法推荐任何 PHP-XMPP 客户端,但我认为您可能不会在 AMQP 中获得同样级别的即插即用功能。

此外,如果您熟练掌握其他语言,并根据所需的游戏逻辑量,您可以编写一个 XMPP 服务器组件。请参见此先前有关 XMPP + 游戏的问题:
XMPP C# Interaction


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接