我在使用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,并且当为同一用户连接新的套接字时,可以断开原始套接字的连接,而改用新的套接字。