【问题标题】:Save socket.io ID for all open tabs in browser为浏览器中所有打开的选项卡保存 socket.io ID
【发布时间】:2013-09-10 08:45:00
【问题描述】:

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

示例:

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

【问题讨论】:

    标签: node.js session browser socket.io


    【解决方案1】:

    如果您不想(或不能)使用某种会话存储,并且想将消息发送到具有相同 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'];
    

    【讨论】:

    • 当客户端断开连接时,如何从阵列中移除该套接字?
    • socket.on('disconnect', ...)
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 事实上我没有 node.js 服务于完整的 HTTP 服务器。我拥有的主要应用程序基于Apache + PHP。与dNode,形成PHPnode.js 之间的传输,它携带user_id 和其余的元数据。在此,像这样的会话我不能在节点上。
    • 您仍然有 cookie 与 HTTP 请求一起发送到前端,因为它们被执行到同一个域。此 cookie 包含用于恢复会话的数据。您需要一些用于会话的外部存储,考虑使用 Redis 或任何类似的会话数据存储。这样 PHP 和 node.js 将能够访问您的会话数据。
    • 你看,甚至没有在会话的情况下。主要目标:设置你的socket.id。它可以是会话(我将从 coockies 中获得:PHPSESID)和 user_id,没关系。然后有必要发送消息来识别会话(整个),而不仅仅是在 socket.id 上: IM.parentSocket.socket ('some id').emit('removeMessages', message);
    • 那么您的问题与您的情况完全无关。忘记socket.id - 你需要识别socket属于谁(人),而PHPSESID是帮助这个的数据。您不能将相同的套接字用于两个不同的连接(选项卡)。所以忘记socket.id作为一种解决方案 - 它只是它自己的套接字ID,与用户识别无关。
    • 看,我把这条消息发送给socket.id。我肯定需要它!发给我的消息是这样的:io.socket('This socket.id, that I should be the same for all tabs.').emit('event', some_data);
    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2017-03-19
    • 2016-09-24
    • 2017-03-18
    • 1970-01-01
    相关资源
    最近更新 更多