node.js - Socket.IO "Host"断开连接时断开所有房间用户

标签 node.js redis express socket.io

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

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

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

最佳答案

在 socket.io 中似乎没有这方面的机制,但自己实现它并不难。您只需遍历房间中的每个 socket 并调用 disconnect 方法。理想情况下,这将是一个 io.sockets 级别的方法,但您必须知道套接字正在使用的命名空间,因此我在套接字级别添加了一个原型(prototype)来将每个人引导出房间。请看以下内容:

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 的更新可能会破坏此功能。

关于node.js - Socket.IO "Host"断开连接时断开所有房间用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9812940/

相关文章:

node.js - 如何使用 GraphQL 和 ApolloStack 解析联合/接口(interface)字段

mysql - 用于存储词典列表的数据库

comments - 如何在 Redis 中构造 1 级嵌套注释?

c++ - OpenSSL:EC_POINT_set_compressed_coordinates_GFp 段错误

javascript - aws-serverless-express 具有 serverless-offline 阶段中断路由

javascript - 获取不发送 Cookie

Redis 删除多个集合中的元素

javascript - 如何在提交 POST 请求后通过 GET 请求呈现我的最新数据

node.js - Pug/Jade 模板引擎 : html beautifier?

node.js - 如何在挂载的 Express 应用程序中共享 session