我正在使用JavaScript制作多人(2人)浏览器游戏。玩家进行的每次移动都将被发送到服务器并在传输给对手之前进行验证。由于WebSockets尚未准备好迎接黄金时段,我正在将长轮询视为一种传输数据和node.js的方法看起来非常有趣!我已经浏览了一些示例代码(聊天示例,标准长轮询示例等),但我看到的所有示例似乎都向每个客户端广播所有内容,我希望避免这些内容。对于一般的服务器消息,这很好,但我希望两个玩家能够在大厅中左右,并进入“私人消息”模式。
所以我想知道是否有办法在使用nodejs作为验证桥的两个客户端之间实现私人消息传递?像这样:
ClientA->nodejs: REQUEST
nodejs: VALIDATE REQUEST
nodejs->ClientA: VALID
nodejs->ClientB: VALID REQUEST FROM ClientA
答案 0 :(得分: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,并向其他客户端发送该客户端断开的消息。 / p>
// 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.Stream
或request.connection
或其他任何内容。
如果您没有保持活动连接,请记住在HTTP中,这将使TCP连接关闭,因此当然使客户端无法保留在大厅内。如果您在顶部使用没有HTTP的普通TCP连接(例如在Flash应用程序或WebSockets中),那么您应该能够保持打开而不必担心保持活动状态。除了我在这里展示的内容之外,还有其他方法可以解决这个问题,但我希望至少让你开始。关键是为每个客户保留一个持久对象。
免责声明:我不是Node.js专家(我还没有安装它)但是我一直在阅读它并且我对浏览器js非常熟悉,所以我希望这在某种程度上有所帮助。