【问题标题】:Disconnect All Users of Room when "Host" Disconnects in Socket.IO当 Socket.IO 中的“主机”断开连接时,断开 Room 的所有用户
【发布时间】:2012-03-21 21:12:44
【问题描述】:

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

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

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

【问题讨论】:

  • 看起来像这个问题的骗子:stackoverflow.com/questions/8517242/…也许这个答案对你有用。
  • 是的,我在发布我的问题之前发现了这个问题。建议的答案不起作用。简单地使 node.js 崩溃并出现错误。 TypeError: Object #<SocketNamespace> has no method 'leave'

标签: node.js redis express socket.io


【解决方案1】:

socket.io 中似乎没有这种机制,但自己实现它并不是很困难。您只需遍历房间中的每个套接字并调用断开连接方法。理想情况下,这将是一个 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 的更新可能会破坏此功能。

【讨论】:

    【解决方案2】:

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

    例如;

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

    这可能会对您的场景有所帮助。

    【讨论】:

      【解决方案3】:

      这是我在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());
         });
      }
      

      【讨论】:

        【解决方案4】:

        在尝试通过 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('/');
            }
          });
        });
        

        【讨论】:

        • 这只会破坏会话,而不会影响 soket.io 房间。至少据我所知。
        猜你喜欢
        • 2017-07-17
        • 2014-10-13
        • 1970-01-01
        • 1970-01-01
        • 2014-04-30
        • 2012-05-17
        • 1970-01-01
        • 2016-07-08
        • 1970-01-01
        相关资源
        最近更新 更多