在Socket.IO中“主机”断开连接时断开所有房间用户

时间:2012-03-21 21:12:45

标签: node.js redis express socket.io

目前,我有一个房间的发起人标记为“主持人”。 我需要设置它,以便如果“主持人”点击“关闭房间”链接,它将断开所有用户与该房间ID的连接。

我如何从socket.manager.roomClients或类似的东西中获取所有用户,如果“主机”的room_id与套接字管理器中的密钥匹配,则遍历它们并运行某种类型的socket.leave( room_id )? / p>

感谢您的任何见解或帮助。如果我需要澄清任何内容,请告诉我。

4 个答案:

答案 0 :(得分:7)

在socket.io中似乎没有这种机制,但是自己实现它并不是非常困难。您只需遍历房间中的每个套接字并调用disconnect方法。理想情况下,这应该是一个io.sockets级别的方法,但你必须知道套接字正在使用的命名空间,所以我在套接字级别添加了一个原型来引导每个人进入一个房间。看看以下内容:

var sio = require('socket.io');
var io = sio.listen(app);

sio.Socket.prototype.disconnectRoom = function (name) {
    var nsp = this.namespace.name
    , name = (nsp + '/') + name;

    var users = this.manager.rooms[name];

    for(var i = 0; i < users.length; i++) {
        io.sockets.socket(users[i]).disconnect();
    }

    return this;
};

您可以使用它,如下所示。

socket.on('hostdisconnect', function() {
    socket.disconnectRoom('roomName');
});

警告一句,如果您打算使用类似的东西,重要的是要注意它使用的内部数据结构可能会或可能不会出现在socket.io的下一个版本中。 socket.io的更新可能会破坏此功能。

答案 1 :(得分:0)

经过尝试通过socket.io进行了多次斗争后,我找到了通过Node.JS / Express来杀死房间的方法

app.get('/disconnect', function(req, res){
  console.log("Disconnecting Room " + req.session.room_id);
  req.session.destroy(function(err){
    if (err){
      console.log('Error destroying room... ' + err);
    } else{
      res.redirect('/');
    }
  });
});

答案 2 :(得分:0)

socket.io中的最新更新是leave()方法,作为join()的伴侣。

例如

    socket.join('room1');
    socket.leave('room1');

在您的方案中可能会帮助您。

答案 3 :(得分:0)

这是我在socket.io "version": "2.1.1"中设法做到这一点的方法:

function disconnectRoom(room: string, namespace = '/') {
   io.of(namespace).in(room).clients((err, clients) => {
      clients.forEach(clientId => this.io.sockets.connected[clientId].disconnect());
   });
}