一尘不染

在socket.io中管理多个选项卡(但同一用户)

node.js

我在使用socket.io时遇到了一些问题,我也不知道如何解决。我有一个带有socket.io登录系统的应用程序,用于管理用户交互。我还有一个数组来管理所有活动的websocket会话。该数组存储一对session.id
=> username。

当用户打开具有相同页面(或使用websocket的其他页面)的新标签时,问题就开始了。这会导致数组中的用户名条目重复。

{id1, username}
{id2, username}

当套接字向用户发送消息时,它仅发送到阵列的第一个会话ID,因此只有一个选项卡接收到该消息。

我试图更改新连接的套接字ID以匹配其他连接,但是它不起作用。

socket.id = sessionId of the other websocket;

我认为另一种解决方案是将消息发送到所有开放的会话,但是我认为这不是最好的方法。

谢谢。


阅读 269

收藏
2020-07-07

共1个答案

一尘不染

听起来您可能是在问问题中的套接字ID,而不是会话ID。如果您有快速会话,则可以使用会话ID,无论打开了多少标签,只要它们使用相同的浏览器且未处于“私有”模式,该ID都将相同。看一下这个问题,了解如何在socket.io中启用会话。

socket.io和会话?

更新: 保存会话ID时,会将其与用户的昵称和连接的套接字相关联。然后,您可以遍历每个套接字并发送消息。类似于以下内容:

[
    {sessionId: '12345', nickname: 'timmay!', socketIds: [1, 2, 3]},
    {sessionId: '23456', nickname: 'pete', socketIds: [4, 5, 6]}
]

建立另一个连接后,可以将新的套接字ID推入socketIds数组中,而当用户断开连接时,可以删除该ID。

另一种选择可能是每个会话每个用户只允许一个选项卡。您可以存储一个socketId,并且当为同一用户连接新的套接字时,可以断开原始套接字的连接,而改用新的套接字。

2020-07-07