我在2个用户之间使用java后端(tomcat,spring)进行简单的ajax游戏。我需要一些通知一个用户他的对手转弯的好方法。现在所有的沟通都是通过数据库完成的,并等待对手完成他的转弯,如下所示:
while(!timeout && !opponentIsDone) {
//...get the game record from db and check if opponent made turn
Thread.sleep(100);
}
我可以用sleep()以某种方式摆脱这个循环,并立即得到通知,但没有延迟(但有超时)?我可以创建一些全局静态var并通过它进行通信,但我仍然需要类似的循环,否则可能会更小。
我不能只在转弯完成后调用一些方法,因为它需要通过ajax转到浏览器,我不能在那里推送数据,只能拉动。所以我需要有等待对手的过程。
我正在寻找一些简单明了的解决方案。
感谢。
答案 0 :(得分:2)
您可能希望了解Tomcat的高级IO(Comet)支持 http://tomcat.apache.org/tomcat-6.0-doc/aio.html
答案 1 :(得分:2)
我认为您正在寻找分布式事件(又称订阅者/发布者)模式,我相信Dojo Framework已经实现了它: http://ajaxpatterns.org/Distributed_Events
答案 2 :(得分:1)
有很多方法可以将通知推送到Web客户端。 Gmail的IM客户端就是这种事情的一个很好的例子。这通常通过以某种方式保持开放的HTTP连接来实现,并且这一系列技术被称为COMET。维基百科有一篇关于它的文章,并且有专门讨论该主题的博客(http://cometdaily.com/)。
即使您没有使用此技术,您仍可以对您在问题中确定的算法进行许多改进。一种方法是使用等待/通知类型模式或订户/发布者方法。另一种方法是立即返回“等待其他玩家转弯”页面,并让该页面每隔几秒自动刷新一次,直到其他玩家轮到他为止。
我认为您正在寻找的解决方案是COMET风格的通知。
答案 3 :(得分:1)
如果您有某种全局静态变量,可以使用java.util.concurrent.BlockingQueue< T>
的BlockingQueue<转动> handoff = new ArrayBlockingQueue< Turn>(1);
//对手线程
handoff.offer(myTurn);
//其他线程可以使用
转其他转动= handoff.poll(90,TimeUnit.SECONDS);
if(otherTurn == null)
//然后没有转弯
您可以使用SynchronousQueue而不是ArrayBlockingQueue轻松让人们互相等待。
当然它不需要是全局静态的 - 它可以是两个用户都可以访问的任何东西。
答案 4 :(得分:1)
flex / flash有一个实时聊天室系统(使用远程对象编程)。
你必须安装BlazeDS(免费)http://opensource.adobe.com/blazeds/,它附带了示例应用程序。这称为AMF技术。我认为Spring确实以这种或那种方式支持这种AMF。
http://www.adobe.com/devnet/livecycle/articles/blazeds_spring.html http://blog.springsource.com/2008/12/17/using-spring-blazeds-integration-m1/
这对基于Flash的网站有好处。但是,如果您不想使用闪光灯,我认为您可以隐藏它或使其足够小,只需将其用作页面上的通信频道。
也许你必须找到一种方法来在从服务器接收数据后通知你的网页/ javascript。
是的,我知道这个方法有点hacky,并不是一个干净的做事方式:)只是为你提供一个替代方案。
答案 5 :(得分:1)
DWR(Direct Web Remoting)是一个允许您使服务器上的Java方法直接可用于Javascript(通过创建代理)的包。它有一个称为“反向Ajax”的功能,这是一种处理推送方案的简单方法。
答案 6 :(得分:0)
如果你没有被Tomcat锁定,也许可以考虑Jetty Continuations?
http://bill.burkecentral.com/2008/11/12/buggybroken-tomcat-6-comet-nio-apis/对Tomcat NIO进行了一些讨论