当前位置: 首页 > 面试题库 >

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

常翰
2023-03-14
问题内容

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

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

{id1, username}
{id2, username}

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

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

socket.id = sessionId of the other websocket;

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

谢谢。


问题答案:

听起来您可能是在问问题中的套接字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,并且当为同一用户连接新的套接字时,可以断开原始套接字的连接,而改用新的套接字。



 类似资料:
  • 问题内容: 我有一个常规的Twitter Bootstrap 3标签。我要做的就是控制 一个元素来控制多个容器。 在此示例中,当我更改标签时,仅第一个被更改。我要两个容器都改变,而不仅仅是第一个。 谢谢! 问题答案: 我将 data-target 属性添加到a元素并更改第二个tab内容中的id 我修改了这行 您的: 我的更新: 第二个选项卡内容,您的: 我的更新:

  • 问题内容: 我想知道是否可以通过Spring Security验证用户会话,从而仅打开一个浏览器选项卡。可能吗? 我还想知道是否可以执行以下操作:当用户关闭该选项卡并在会话结束之前从直接应用程序中再次打开它之前,将其打开,而无需转到登录屏幕。 我正在使用JSF 1.2,RichFaces 3.3.3,Hibernate和Co … 详细信息:我知道弹簧安全性,我正在研究它。 现在,谢谢我的英语不好。

  • 问题内容: 我想在包含该链接页面的同一窗口和同一选项卡中打开一个链接。 当我尝试使用打开链接时,它将在新选项卡中打开,而不是在同一窗口的同一选项卡中打开。 问题答案: 你需要使用name属性: 编辑:URL应该在协议之前。没有它,则尝试打开相对URL。经过Chrome 59,Firefox 54和IE 11的测试。

  • 我有一个手风琴,这是工作绝对好,但我需要的是,只打开一个标签一次,这意味着当一个标签打开,然后另一个标签应该关闭。 目前,您可以看到,我们可以通过单击选项卡链接打开所有选项卡。 代码在这里 这里是小提琴

  • 我试图创建一个标签,显示一个列表的左手片段和一个详细的片段在右边。当用户单击列表项时,右边的片段应该更改为适当的片段。 我是android新手,所以我使用了一个教程,我知道我需要用TabListener做一些事情:

  • 我需要的每个项目都有多个SQL查询。我的问题是,我所有的项目都需要Workbase中相同的MySQL连接。 因此,我一直打开着大量的SQL选项卡,如下所示: 由于选项卡的数量超过了显示器的宽度,因此我必须左右滚动才能找到一些查询。唯一的方法是单击两个箭头(屏幕截图的右侧)。这真的很不清楚,也很烦人。 有没有更好的处理方法?是否可以在多个SQL选项卡之间快速切换,或者以另一种方式排列?