0

我使用Rails创建了一个在线多人游戏棋盘游戏,我希望游戏能够在无需手动刷新页面的情况下进行播放。我打算使用websockets或Server Sent Events来更新页面。我还没有确定,但我不认为它会对我的问题产生影响。如何在Rails中触发实时客户端更新

我很困惑的事情是知道什么时候发送更新到客户端。例如,假设我正在下棋,并且player1轮到了。他们会发送他们的移动到服务器,服务器然后将其保存到数据库。 player2的websocket或SSE如何知道将player1移动到player2的浏览器的信息?

我知道他们可以定期查询数据库以查看游戏是否已更新,但由于每个用户都经常查询数据库,因此似乎难以扩展。

是否有一种简单的方法来等待数据库的更新并以某种方式自动通知它?还是有其他解决方案?

我已经在网上看了一大堆解决方案,但还没有真正得到任何具体的想法。只要是免费的,我绝对愿意使用图书馆或其他方式解决问题。我见过一些付费解决方案,但这些都不是一种选择。

我还看到有人建议以某种方式使用node.js与rails一起实时地执行某些操作。我对node.js了解不多,但我听说它对于这种异步功能非常有用。如果它比任何rails解决方案都好,我会对如何使用它感兴趣。

我使用的是Rails 3.2,但是如果Rails 4在这里能够很好地工作,我可能会对此感兴趣。

回答

2

正如聂建议,使用FAYE Ruby的服务器,如果你是一个Ruby开发。

在事情如何能够团结在一起方面:

  1. 每场比赛是一个通道
  2. 每个玩家订阅了这个频道
  3. 当玩家做出的举动,此举被发送到服务器
  4. 服务器在db中保存针对游戏的移动
  5. 服务器将消息发送到通道。
  6. 双方球员的ui都会随着新动作更新。

这个设置可以让你轻松地重放整个游戏或继续你离开的地方。只需从db中获取所有动作并将它们发送到一个新频道即可。这可能不是高性能的,但它应该工作。

+0

FAYE似乎使用长轮询或服务器发送的事件。是否有可能使用双向通信,如websockets?因此,您不需要为每个移动单独提供http请求,而是使用相同的websocket来提交所有移动操作? – bdwain 2013-05-13 18:12:11

+0

我的意思是使用相同的websocket来提交你所有的动作,并从游戏频道接收更新 – bdwain 2013-05-13 21:19:50

+0

是的,客户端连接到FAYE服务器,可以发送消息到服务器或从服务器订阅(接收)事件。 – AndyD 2013-05-13 21:49:02

0

,你也可以使用FAYE具有红宝石服务器和Node.js的服务器,你可以选择一个