使用HTML/JS/AJAX/Java开发一个多人在线浏览器卡牌游戏

4
我目前开发了一款多人卡牌游戏,使用Java编写并在控制台中运行。这个游戏的格式类似于桥牌和黑桃,但没有叫牌过程。它是一个四人游戏,玩家轮流出牌。
我正在努力将其转换为基于浏览器的Web应用程序,并添加Spring MVC,并使用HTML、JavaScript和AJAX实现UI和与后端的通信。我已经有了一个很好的想法,可以让用户单人对抗AI,并使用AJAX调用从服务器获取接下来的三个出牌。
然而,我想知道如何处理多人游戏。我看到了一些关于“Socket编程”的参考资料,但我不熟悉它们,因为它们似乎围绕着Java小程序而不是基于浏览器的应用程序。
基本上,我正在寻找一种方法来确保当用户开始游戏并有其他人加入时,如何确保他们连接到同一个游戏并能够看到彼此的出牌?我现在就问这个问题,因为我想避免完全重新设计以支持多人功能,即使我的单人游戏UI还没有完全开发出来。

2
你可以使用长轮询,但根据你的服务器结构,那可能不是最好的解决方案。或者,你可以让每个客户端的脚本重复调用服务器以寻找新数据。理论上,你希望每个玩家都有相同的“sessionID”,他们将使用此ID调用服务器。显然,你希望这个ID被哈希处理。 - Shmiddty
1个回答

6
由于您正在创建一个多人游戏,因此您需要至少一个服务器供客户端连接。由于您希望将其基于浏览器,所以您很可能需要自己的服务器(而不是让其中一个客户端成为服务器)。当用户加入游戏时,它会被记录在该用户所在的服务器上。当玩家执行操作时,服务器会处理该操作,然后向连接到该房间的其他每个客户端发送通知。此时,客户端的UI会更新。
过去,您无法使用纯HTML / JavaScript完成此操作,因为您无法打开套接字。这意味着服务器无法通知客户端。但是,在HTML5中,您应该能够使用WebSockets来实现在中间服务器上所做的事情。WebSocket API 然而,如果您不想使用HTML5 WebSockets,还有另一种技术可以在JavaScript中模拟Sockets。也就是说,服务器可以与客户端通信。这种技术称为长轮询。客户端向服务器发送请求以请求更新,如果没有可用的更新,则服务器保持该请求直到有更新可用并将其发送回客户端,此时它们会发出另一个更新请求。简单的长轮询示例 另一个选择是,如果您非常熟悉Java,您可能希望查看Google Web Toolkit。GWT是Java的子集,编译成HTML和JavaScript用于前端,并且如果需要创建一个Server Side java可执行文件,您可以将其与TomCat或另一个Web服务一起使用。在此选项中,您有几个库可以让您编写编译为长轮询JavaScript的Socket样式代码。
祝好运!

非常感谢您提供的信息丰富的答案。我想我会选择WebSocket选项,因为看起来IE10也将加入这个领域,并且已经找到了一些很好的教程来帮助实现这一点。我最后一个困惑是关于如何保持游戏的正确性。我想我会让服务器维护一个Game对象数组(我已经创建了这个对象)。我将在我的Game对象中添加一个“gameId”数据成员,并将此ID与UI之间的每个请求发送/接收。这听起来像是一个可行/高效的方法吗? - SteveKerr
我建议使用哈希的gameSessionID,每个游戏都是唯一的,并且使用一个并发安全的映射从gameSessionIDs到Games。由于您有多个用户与服务器通信,因此并发性非常重要。请确保阅读如何安全地执行此操作。由于您熟悉Java,您可能希望从这里开始:Lesson: Concurrency - Joe
长轮询比Websockets更好。我讨厌Websockets。 - Shahid Karimi

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