获取客户端当前在断开连接事件中所在的房间列表

2023-11-27

我正在尝试查找客户端当前在断开连接事件中所在的房间列表(关闭浏览器/重新加载页面/互联网连接已断开)。

我需要它的原因如下:用户已进入几个房间。然后其他人也做了同样的事情。然后他关闭了浏览器选项卡。我想通知他所在房间里的所有人他离开了。

所以我需要在“断开连接”事件中做一些事情。

io.sockets.on('connection', function(client){
  ...
  client.on('disconnect', function(){

  });
});

我已经尝试了两种方法,发现它们都是错误的:

1)迭代adapter.rooms.

for (room in client.adapter.rooms){
   io.sockets.in(room).emit('userDisconnected', UID);
 }

这是错误的,因为适配房包含所有房间。不仅仅是我的客户所在的房间。

2)正在经历client.rooms。这会返回客户端所在房间的正确列表,但不会返回断开连接事件。断开连接时此列表已为空[].

那么我该怎么做呢?在撰写本文时,我正在使用最新的 socket.io:1.1.0


默认情况下这是不可能的。看一下socket.io的源代码。

那里有你的方法Socket.prototype.onclose这是在之前执行的socket.on('disconnect',..)打回来。所以在那之前所有的房间都被留下了。

/**
 * Called upon closing. Called by `Client`.
 *
 * @param {String} reason
 * @api private
 */

Socket.prototype.onclose = function(reason){
  if (!this.connected) return this;
  debug('closing socket - reason %s', reason);
  this.leaveAll();
  this.nsp.remove(this);
  this.client.remove(this);
  this.connected = false;
  this.disconnected = true;
  delete this.nsp.connected[this.id];
  this.emit('disconnect', reason);
};

一个办法could要么破解 socket.js 库代码,要么覆盖此方法,然后调用原始方法。我很快就测试了它似乎有效:

socket.onclose = function(reason){
    //emit to rooms here
    //acceess socket.adapter.sids[socket.id] to get all rooms for the socket
    console.log(socket.adapter.sids[socket.id]);
    Object.getPrototypeOf(this).onclose.call(this,reason);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取客户端当前在断开连接事件中所在的房间列表 的相关文章

随机推荐

  • 如何使用 C# 渲染 pdf

    我想使用 C 以图形方式加载和绘制 pdf 文件 我不需要编辑它们或任何东西 只需以给定的缩放级别渲染它们即可 我发现的pdf库似乎专注于生成 我该怎么做呢 Thanks 谷歌开源了其优秀的PDF渲染引擎 PDFium 它是用 Foxit
  • 将 VBS 脚本分配给键盘快捷键

    我有一个非常基本的 VBS 脚本 我计划在我的 Windows 7 计算机上经常使用它 有什么方法可以将它绑定到键盘快捷键 这样我就不必通过浏览器令人讨厌地导航到它 我意识到这个问题并不直接涉及编程 甚至与脚本编写无关 但我无法在网上或通过
  • 如何将数据表插入SQL Server数据库表中?

    我已从某些 Excel 文件导入数据并将其保存到datatable 现在我想将此信息保存在我的SQL Server数据库 网上查了很多资料 但看不懂 有人说逐行插入另一个建议的批量更新 等等 这更好吗 我应该使用OLE or SQL Ser
  • Microsoft SQL Server CE(精简版)3.5 的 jdbc 驱动程序

    我希望能够探索此版本数据库的数据库内容 我正在考虑使用 Squirrel DB 客户端 需要 JDBC 驱动程序 因此 我正在寻找适用于 SQL SERVER 3 5 的 JDBC 类型 4 驱动程序 有人可以向我指出免费或开源或试用软件吗
  • 当实现你自己的 IUserStore 时,类上的“可选”接口实际上是可选的吗?

    我正在使用 Microsoft 的 Asp Net Identity 框架版本 2 并正在实现我自己的 IUserStore 我的新班级MyUserStore实施IUserStore
  • 位运算符在 Java 中到底是如何工作的?

    我目前正在尝试了解 Java 中的按位和位移运算符 尽管它们在简化的玩具示例 基本上是正整数 中对我来说是有意义的 但一旦涉及负数 以及在其他一些情况下 我的理解就会崩溃 我尝试用两个搜索引擎在互联网上进行搜索 甚至检查了Java规范 我找
  • 在轨道中销毁之前检查所有关联

    我的应用程序中有一个重要的模型 有很多关联 如果我想检查 before destroy 回调中的所有引用 我必须执行以下操作 has many models 1 has many models 2 mas many models 3 has
  • 避免将 master 合并到开发分支中

    我从每个冲刺开始就一直在监控两个分支 Release and Master Master分支是开发人员创建新分支 特定于任务 实现更改并创建合并到分支中的拉取请求的地方Master Release分支是特定于冲刺的 始终可提交给生产 我们只
  • 2-SUM 的线性时间算法

    给定一个整数 x 和一个由 N 个不同整数组成的排序数组 a 设计一个线性时间算法来确定是否存在两个不同的索引 i 和 j 使得 a i a j x 这是类型子集和问题 这是我的解决方案 不知道是不是早知道了 想象一下两个变量 i 和 j
  • 您推荐哪些 Javascript 模板引擎? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我想知道您对javascr
  • 使用 CarrierWave 混合文件类型

    我有一个 CarrierWave 上传器 可以接受各种文件类型 有些是图像类型 例如 jpg png 有些则不是 我想创建上传文件的中等版本 version medium do process resize to fit gt 300 30
  • 使用类似 SQL 的 IN 子句过滤 Pyspark DataFrame

    我想用类似 SQL 的方法过滤 Pyspark DataFrameIN子句 如 sc SparkContext sqlc SQLContext sc df sqlc sql SELECT from my df WHERE field1 IN
  • 如何通过电子邮件将我正在开发的 Android 应用程序发送给某人?

    这是我的第一个 Android 应用程序 我需要将迄今为止的内容通过电子邮件发送给某人进行测试 我应该如何导出应用程序并附加它 以免它被视为垃圾 更简单的方法 将 apk 放在您的网络服务器上 使用以下命令创建 QR 条形码图像 然后通过电
  • 为什么 CAP 定理中的 C 与 ACID 中的 C 不同?

    我的问题很简单 正在寻找一个更简单的答案 为什么 CAP 定理中的 C 与 ACID 中的 C 不同 Read thisHN 螺纹 Update NOSQL v1 0 搭便车指南 幻灯片 71 说 CAP 中的 C A C 原子一致性 两个
  • 跟踪数据库模式更改的机制[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 跟踪和 或自动化数据库架构
  • 计算两个 Pandas 列之间的时间差(以小时和分钟为单位)

    我有两列 fromdate and todate 在数据框中 import pandas as pd data todate pd Timestamp 2014 01 24 13 03 12 050000 pd Timestamp 2014
  • 将 std::experimental::filesystem 与 Xcode 9 链接

    我正在使用 std experimental filesystem 和 Xcode 9 0 beta 编译器阶段完成正常 但链接器抱怨未定义的符号 std experimental filesystem v1 path filename c
  • 创建大量线程时出现.Net 内存泄漏

    我有一个随着时间的推移创建大量线程的应用程序 我注意到内存使用量随着它的运行而增加 并最终耗尽内存 但相同的代码在我同事的环境中不会泄漏内存 我们都有相同的 net 版本 我能够使用以下示例代码重现该问题 该代码不会在我同事的笔记本电脑上泄
  • 为什么最好从方法类的实例中静态调用静态方法?

    如果我在 Java 中创建类的实例 为什么最好静态调用同一类的静态方法 而不是使用 this method 当我尝试通过 this staticMethod 从自定义类的构造函数中调用静态方法 staticMethod 时 我收到来自 Ec
  • 获取客户端当前在断开连接事件中所在的房间列表

    我正在尝试查找客户端当前在断开连接事件中所在的房间列表 关闭浏览器 重新加载页面 互联网连接已断开 我需要它的原因如下 用户已进入几个房间 然后其他人也做了同样的事情 然后他关闭了浏览器选项卡 我想通知他所在房间里的所有人他离开了 所以我需