如何在Rails中触发实时客户端更新

时间:2013-05-13 08:02:06

标签: ruby-on-rails node.js websocket real-time server-sent-events

我正在使用Rails创建一个在线多人桌面游戏,我希望无需手动刷新页面即可播放游戏。我打算使用websockets或Server Sent Events来更新页面。我还没有决定哪一个,但我不认为这会对我的问题产生影响。

我很困惑的是知道何时向客户端发送更新。例如,假设我正在下棋,而player1转了一圈。他们会将他们的移动发送到服务器,服务器然后将其保存到数据库。 player2的websocket或SSE如何知道如何将有关player1移动的信息推送到player2的浏览器?

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

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

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

我也看到有人建议以某种方式使用node.js和rails一起实时做某事。我对node.js了解不多,但我听说它对这样的异步功能有好处。如果它比任何rails解决方案更好,我会对学习如何使用它感兴趣。

我正在使用Rails 3.2,但是如果Rails 4有一些在这里运行良好的东西,我也可能对此感兴趣。

2 个答案:

答案 0 :(得分:2)

正如nik建议的那样,如果你是一个红宝石开发者,请使用FAYE Ruby服务器。

就事情如何挂在一起而言:

  1. 每个游戏都是一个频道
  2. 每位玩家订阅此频道
  3. 当玩家移动时,移动将被发送到服务器
  4. 服务器在db
  5. 中保存针对游戏的移动
  6. 服务器向频道发送消息。
  7. 两位玩家的ui都用新动作更新。
  8. 此设置可让您轻松重播整个游戏或继续您离开的地方。只需从db获取所有移动并将它们发送到新频道。这可能不具备效果,但它应该有效。

答案 1 :(得分:0)

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