1

您能告诉我如何解决socket.io浏览器中所有打开的选项卡的身份保存问题吗?

例子:

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

4

2 回答 2

7

如果您不想(或不能)使用某种会话存储,并且想要将消息发送到具有相同 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'];
于 2013-09-09T04:19:40.137 回答
0

socket的ID在任何情况下都是不同的,在任何情况下都不应该用来识别用户。它仅用于识别自己的 Socket。

您正在寻找的是会话。将套接字连接与会话相关联的能力 - 是您正在寻找的。为此,您需要为新的 http 连接创建会话,并在 socket.io 的握手过程中恢复此会话。这样,您将能够识别该特定套接字属于特定会话。

然后是用户数据和您保持会话的其他内容。这在许多情况下都有帮助 - 在页面刷新时恢复会话或根据需要在多个选项卡中使用单个会话。

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

于 2013-09-06T10:09:17.900 回答