socket.io:查找单个用户的所有套接字的最佳方法

时间:2014-03-16 19:48:58

标签: node.js socket.io

我正在尝试制作推送通知系统,但要做到这一点,我需要找到向用户的所有活动套接字连接发出内容的正确方法(我们假设已登录的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')或某种神奇的东西?

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

1 个答案:

答案 0 :(得分:2)

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

socket.join('user_1');

然后使用以下方式向房间中的每个人(即用户所连接的所有插座)广播:

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

您实际上可以检索房间中所有套接字的ID,但我唯一真正发现它的必要条件是计算ID数量以查看用户是否仍然连接。

会议室的完整文档为on the Socket.io wiki