4

考虑以下实现井字游戏:

一名玩家通过触发主调度程序上的事件来发送移动。

var dispatcher = new WebSocketRails('localhost:3000/websocket');

var channel = dispatcher.subscribe_private('private_game');
channel.bind('new_move', function(move) {
  // received new move, process it
});

// later on when we want to send a move to the server we run the following code
var move = {
  square: ...;
}
dispatcher.trigger('move', move);

在服务器上,控制器可以验证用户是否已获得特定井字游戏的授权。然后它可以向两个玩家广播这一举动。

class TicTacToeController < WebsocketRails::BaseController
  def move
    # code to verify the move is valid and save to database
    ...

    # broadcast move to all players
    WebsocketRails[:private_game].trigger(:new_move, message)

  end
end

但是没有强制要求客户端仅使用主调度程序发送消息。假设“private_game”频道仅供服务器用于广播动作。但是一个敌对的客户端可以在上面发送随机数据

channel.trigger('new_move', randomdata);

由于通道事件不通过事件路由器,因此不通过控制器操作,因此服务器端没有任何东西可以过滤掉随机垃圾邮件。

有没有办法阻止服务器上的随机数据垃圾邮件?也许我误解了如何使用 websocket-rails?

4

1 回答 1

0

在 Gem 更新以更好地支持此功能之前,您现在可以处理此问题的一种方法是为每个用户使用单独的私人频道。

例子

  • 游戏开始

    1. 用户 A 连接到名为user_a_incoming_moves
    2. 用户 B 连接到名为user_b_incoming_moves

当用户 B 移动时,您会在user_a_incoming_moves只有用户 A 连接到的私人频道上广播该动作。

当用户 A 移动时,您会在user_b_incoming_moves只有用户 B 连接到的频道上广播该动作。

这将防止任何人通过发送恶意动作。

您可以在私人频道 Wiki中阅读更多关于私人频道的信息。

于 2013-03-06T19:01:18.013 回答