【问题标题】:socket.io : best way to find all sockets of a single usersocket.io :查找单个用户的所有套接字的最佳方法
【发布时间】:2026-01-17 06:15:01
【问题描述】:

我正在尝试制作一个推送通知系统,但要做到这一点,我需要找到正确的方法来向用户的所有活动套接字连接发出一些东西(我们假设登录的 User1 已经打开了我的网站)比他的网络浏览器的一个标签)

所以,当用户连接到他的帐户(带有会话)时,我在 MySQL 中保存了所有活动的套接字 ID:

user_id | socket_id
1       | 4lf3dsg2bx1u9d # User 1...
1       | 75ksdfzfff1u3d # ...has two active socket connections
2       | GEdsfoorbar1z4

在我的脚本中类似于以下内容:

io.sockets.sockets[socket_id].emit(...) # for each sockets of User1

但是,我确信 MySQL 不是对套接字进行排序的最佳方法...

有人有更好的解决方案吗?像io.sockets.has('user=1') 或其他神奇的东西?

我还测试了在 Object 中按用户 ID 存储每个套接字的解决方案,但性能如何?

【问题讨论】:

  • “性能怎么样”?怎么样?它不能比存储在 RAM 中更快..

标签: node.js socket.io


【解决方案1】:

您存储套接字 ID 的策略并不可怕,尽管使用 Redis 之类的东西存储它们会比 MySQL 更好。但是对于您的情况,您根本不需要存储套接字 ID:只需使用 Socket.io 的 rooms 代替。例如,每次用户 #1 建立套接字连接时,在服务器上执行:

socket.join('user_1');

然后使用以下命令向房间里的每个人(即用户连接的所有套接字)广播:

io.sockets.in('user_1').emit('event_name', data);

实际上,您可以检索房间中所有套接字的 ID,但我真正认为有必要的唯一一次是计算 ID 的数量以查看用户是否仍处于连接状态。

房间的完整文档是on the Socket.io wiki

【讨论】:

  • 显然用户可以在多个房间中(比如 User1 可以在“user_1”和“chatroom_1”中),所以这个解决方案不会限制我的应用程序。非常感谢!