用于通过javascript客户端异步通知游戏中发生的更改(即其他客户端进行的移动)的最佳方法是什么。作为示例,假设基于回合的棋盘游戏。我是否应该让客户端每隔一秒左右轮询PHP后端进行新的移动,或者是否有更好的方法向同一游戏中的其他客户端发送异步通知?对于如何在每个客户端的后端实例之间分发通知,您最好的想法是什么?
我目前正在计划将每个移动放在一个SQL数据库中,然后让每个客户端每秒轮询数据库以获取新的移动,但这看起来很蹩脚且效率低......
答案 0 :(得分:2)
每隔一秒左右轮询是一种选择,但您可能需要考虑long polling来减少延迟。
引用Comet Daily: The Long-Polling Technique:
长轮询Comet技术是一种优化传统轮询以减少延迟的技术。
传统轮询以固定间隔向服务器发送XMLHttpRequest。例如,每15秒打开一个新的XMLHttpRequest,接收立即响应,并关闭连接。
长轮询向服务器发送请求,但在有一个响应可用之前,不会将响应返回给客户端。一旦连接关闭,或者由于客户端收到响应或者请求超时,就会启动新连接。结果是延迟显着减少,因为服务器通常在准备好返回信息以返回客户端时建立连接。
答案 1 :(得分:0)
不幸的是,这只有几个选择。如果您想使用推送技术,所有这些都将涉及在服务器上发送某种类型的客户端发送通知。或者轮询是可行的方法。
但正如这里的切线是我多年前玩过的解决方案:http://www.spsolutionscorp.com/blog/2007/03/14/RealTimeUpdatesToWebPageUsingMacromediaFlash.aspx
它的要点是:启用了服务代理的Sql Server。服务器上的.Net服务,它使用SqlDependency监听查询结果的更改(http://support.microsoft.com/kb/555893)。一旦发生更改,.net服务就会通过我在上面的博客文章中写到的flash客户端所做的所有连接进行循环。然后Flash应用程序可以调用页面上的javascript。
这是一个疯狂的想法,我从来没有投入制作。但根据您的使用情况,可能值得研究,并且很容易上手。
但这又是一个完全疯狂的想法,而且我再也没有投入生产,所以使用风险自负。只是想我会分享。
答案 2 :(得分:0)
无论请求和响应的轻量级如何,轮询都可以轻松堆叠并消耗大量资源(例如:带宽)。
http://ajaxpatterns.org/Periodic_Refresh
您可能想尝试使用Comet / HTTP Streaming http://ajaxpatterns.org/HTTP_Streaming