在浏览器中保存所有打开的选项卡的socket.io ID

你可以告诉如何解决保存身份socket.io ,浏览器中的所有打开的标签的问题。

例:

我打开了一个页面(例如/index ),我将它设置为连接到socket.io并获取唯一的会话ID。 但是当我在另一个选项卡上打开相同的页面 – ID创build另一个,也就是说,已经有两个具有两个不同ID的化合物。 这是对的,这是合乎逻辑的。 但是,我需要发送消息到这些ID,同时在所有选项卡(包括绑定到user_id ),因为会话ID是不同的 – 这是不可能的。

如果您不想(或不能)使用某种会话存储,并且想要使用相同的user_id将消息发送到多个套接字,则可以将user_id作为关键字并将一个套接字数组作为值存储

 var socketMap = {}; 

并使用握手数据存储对套接字的引用

 io.sockets.on('connection', function (socket) { var userId = socket.handshake.userId; if(!socketMap[userId]) socketMap[userId] = []; socketMap[userId].push(socket); }); 

或者与一些正常的事件数据

 socket.on('auth', function(data) { var userId = data.userId; var authToken = data.authToken; ... // verify the data... if(!socketMap[userId]) socketMap[userId] = []; socketMap[userId].push(socket); }); 

当你想要一个套接字的列表发送消息

 var sockets = socketMap['some_user_id']; 

任何情况下,套接字的ID都会有所不同,在任何情况下都不应该用来标识用户。 它只是用来识别Socket自身。

你正在寻找的是会议。 能够将套接字连接关联到会话 – 就是你正在寻找的东西。 为此,您需要为新的http连接创build会话,并在socket.io的握手过程中恢复此会话。 这样你将能够识别特定的套接字属于特定的会话。

然后用户数据和其他东西保持会话。 这在很多情况下都有帮助 – 在页面刷新时恢复会话,或者根据需要在多个选项卡中设置单个会话。

阅读如何从握手过程恢复socket.io会话ID的这个答案: http ://www.danielbaulig.de/socket-ioexpress/