【问题标题】:Private messaging through node.js通过 node.js 进行私人消息传递
【发布时间】:2011-03-22 02:30:10
【问题描述】:

我正在用 JavaScript 制作多人(2 人)浏览器游戏。玩家所做的每一步都将被发送到服务器并在传输给对手之前进行验证。由于 WebSockets 还没有为黄金时间做好准备,我正在将长轮询视为一种传输数据的方法,并且 node.js 看起来很有趣!我浏览了一些示例代码(聊天示例、标准长轮询示例等),但我看到的所有示例似乎都向每个客户广播了所有内容,这是我希望避免的。对于一般的服务器消息,这很好,但我希望两个玩家能够在大厅左右摆正并进入“私人消息”模式。

所以我想知道是否有一种方法可以使用 nodejs 作为验证桥在两个客户端之间实现私人消息传递?像这样的:

ClientA->nodejs: REQUEST
nodejs: VALIDATE REQUEST
nodejs->ClientA: VALID
nodejs->ClientB: VALID REQUEST FROM ClientA

【问题讨论】:

    标签: javascript sockets node.js


    【解决方案1】:

    您需要一些方法来跟踪大厅中的客户。你可以用一个简单的全局数组来做到这一点,比如process.lobby[1] = Array(ClientASocket, ClientBSocket) 或类似的东西(可能有一些额外的数据,比如昵称等),其中ClientXSocket 是每个连接的客户端的套接字对象。

    现在您可以将大厅 id(在本例中为 1)挂接到每个客户端的套接字对象上。如果你愿意的话,一种会话变量(没有会话 id 的麻烦)。

    // i just made a hashtable to put all the data in, 
    // so that we don't clutter up the socket object too much.
    socket.sessionData['lobby'] = 1;
    

    这还允许您做的是,在套接字对象中添加一个事件挂钩,以便当客户端断开连接时,套接字可以立即remove itself from the lobby array,并向其余客户端发送此客户端已断开连接的消息。

    // see link in paragraph above for removeByValue
    socket.on('close', function(err) {
      process.lobby[socket.sessionData['lobby']].removeByValue(socket);
      // then notify lobby that this client has disconnected.
    });
    

    我用socket 代替了net.Streamrequest.connection 或其他任何东西。

    请记住,在 HTTP 中,如果您没有保持活动连接,这将使 TCP 连接关闭,因此当然会使客户端无法留在大厅内。如果您使用的是顶部没有 HTTP 的普通 TCP 连接(例如在 Flash 应用程序或 WebSockets 中),那么您应该能够保持它打开而不必担心保持活动状态。除了我在这里展示的方法之外,还有其他方法可以解决这个问题,但我希望我至少能让你开始。关键是为每个客户端保留一个持久对象。

    免责声明:我不是 Node.js 专家(我什至还没开始安装它)但我一直在阅读它并且我对浏览器 js 非常熟悉,所以我我希望这对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      相关资源
      最近更新 更多