我正在尝试制作推送通知系统,但要做到这一点,我需要找到向用户的所有活动套接字连接发出内容的正确方法(我们假设已登录的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在对象中存储每个套接字,但性能如何?
答案 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。