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的服務器,你可以選擇一個

相關問題