Node.js&Socket.IO – 客房问题

考虑一个多聊天应用程序。 用户可以join多个房间( socket.join(room) ),用户可以离开房间( socket.leave(room) )。

当sockets离开房间时,我通知其他房间参与者。 如果sockets目前有3个房间,并且他突然断开了网站而没有按照正确的方式离开房间,那么我怎样才能通知那些用户已经离开的房间呢?

如果我使用套接字断开连接事件,则用户将不再处于此时的任何空间中。 保持单独的用户arrays的唯一方法,还是有一些我没有想过的聪明的方式?

在断开事件期间,套接字仍可用于您的进程。 例如,这应该工作

 io.socket.on('connection', function(socket){ socket.on('disconnect', function() { // this returns a list of all rooms this user is in var rooms = io.sockets.manager.roomClients[socket.id]; for(var room in rooms) { socket.leave(room); } }); }); 

虽然这实际上是不必要的,因为socket.io会在断开事件时自动删除房间 。 但是,如果您正在执行特定操作,则可以使用此方法。

我假设套接字是节点进程中的一个长期居住的对象。 如果是这种情况,那么当用户连接时,你可以很容易的在你的套接字对象上添加一个引用给用户。 当你得到一个套接字断开连接时,你不需要查看会话关联的用户,因为它将在那里。

在连接或login时:

 socket.user = yourUser; 

断开连接:

 socket.on('disconnect', function(){ socket.leave(room, socket.user); } 

请参阅这里查看为套接字对象和单个聊天客户端添加属性的示例:

http://psitsmike.com/2011/09/node-js-and-socket-io-chat-tutorial/