您需要一些方法来跟踪大厅中的客户。你可以用一个简单的全局数组来做到这一点,比如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.Stream 或request.connection 或其他任何东西。
请记住,在 HTTP 中,如果您没有保持活动连接,这将使 TCP 连接关闭,因此当然会使客户端无法留在大厅内。如果您使用的是顶部没有 HTTP 的普通 TCP 连接(例如在 Flash 应用程序或 WebSockets 中),那么您应该能够保持它打开而不必担心保持活动状态。除了我在这里展示的方法之外,还有其他方法可以解决这个问题,但我希望我至少能让你开始。关键是为每个客户端保留一个持久对象。
免责声明:我不是 Node.js 专家(我什至还没开始安装它)但我一直在阅读它并且我对浏览器 js 非常熟悉,所以我我希望这对您有所帮助。