2

我在两个用户之间有一个简单的 ajax 游戏,带有 java 后端(tomcat,spring)。我需要一些好的方法来通知一个用户他的对手转了。现在所有的通信都是通过数据库完成的,等待对手完成他的回合看起来像这样:

while(!timeout && !opponentIsDone) {
     //...get the game record from db and check if opponent made turn
     Thread.sleep(100);
}

我可以用 sleep() 以某种方式摆脱这个循环并立即得到通知而不会延迟(但有超时)?我可能可以制作一些全局静态变量并通过它进行通信,但我仍然需要类似的循环,也许超时会更小。

轮到完成后,我不能只调用某个方法,因为它都需要通过 ajax 进入浏览器,我不能在那里推送数据,只能拉取。所以我需要有等待对手的过程。

我正在寻找一些轻巧简单的解决方案。

谢谢。

4

7 回答 7

2

我认为您正在寻找分布式事件(又名订阅者/发布者)模式,并且我相信 Dojo 框架已经实现了它: http ://ajaxpatterns.org/Distributed_Events

于 2009-07-15T01:59:36.003 回答
2

您可能想了解 Tomcat 的高级 IO (Comet) 支持。
http://tomcat.apache.org/tomcat-6.0-doc/aio.html

于 2009-07-15T01:24:10.010 回答
1

有很多方法可以将通知推送到 Web 客户端。Gmail 的 IM 客户端就是这类事情的一个很好的例子。这通常是通过以某种方式保持开放的 HTTP 连接来实现的,这一系列技术被称为 COMET。维基百科有一篇关于它的文章,还有专门讨论这个主题的博客 ( http://cometdaily.com/ )。

即使您没有使用此技术,您仍然可以对您在问题中确定的算法进行许多改进。一种方法是使用等待/通知类型的模式或订阅者/发布者方法。另一种方法是立即返回“等待其他玩家转弯”页面,并让该页面每隔几秒钟自动刷新一次,直到其他玩家轮到他为止。

不过,我认为您正在寻找的解决方案是 COMET 式通知。

于 2009-07-15T02:14:52.957 回答
1

如果您有某种全局静态变量,则可以使用 java.util.concurrent.BlockingQueue<T>

BlockingQueue<Turn> handoff = new ArrayBlockingQueue<Turn>(1);

// 对手线程
handoff.offer(myTurn);

// 其他线程可以使用
Turn otherTurn = handoff.poll( 90, TimeUnit.SECONDS );

if ( otherTurn == null )
// 那么没有转弯

通过使用 SynchronousQueue 而不是 ArrayBlockingQueue,您可以轻松地让人们互相等待。

当然,它不需要是全局静态的——它可以是两个用户都可以访问的任何东西。

于 2009-07-15T04:05:35.270 回答
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 的网站。但是,如果您不想使用 Flash,我认为您可以将其隐藏或使其足够小,以将其用作页面上的通信渠道。

也许您必须找到一种方法来在 flash 从服务器接收数据后通知您的网页/javascript。

是的,我知道这种方法有点老套,而且它不是一种干净的做事方式:) 只是为您提供一种替代方法。

于 2009-07-15T05:14:15.973 回答
1

DWR(Direct Web Remoting)是一个包,它允许您使服务器上的 Java 方法直接可用于 Javascript(通过创建代理)。它有一个名为“Reverse Ajax”的特性,它是一种处理推送场景的简单方法。

于 2009-07-15T16:13:12.037 回答
0

如果您没有被锁定在 Tomcat 中,也许可以考虑 Jetty Continuations?

http://bill.burkecentral.com/2008/11/12/buggybroken-tomcat-6-comet-nio-apis/有一些关于Tomcat NIO的讨论

于 2009-11-05T03:25:03.977 回答