有没有办法共享浏览器标签之间的套接字连接

问题描述:

有些人已经在其他地方问过这个问题,我只是不确定它是否存在于这里。无论如何,我使用Primus.ioengine.io,因为它是变压器。我想知道是否有可能在浏览器(客户端)上共享websocket连接。就像我连接一个客户端并在另一个选项卡上连接另一个客户端一样。理想情况下,他们应该得到相同的连接,如果我通过套接字发送的东西,两个标签应该能够得到消息。有没有办法共享浏览器标签之间的套接字连接

其他人提到过使用localStorage作为在不同标签上共享/传递相同数据的一种方式,但我不觉得它整洁。

非常感谢您的帮助。

最佳,

+0

这就是套接字的工作方式,不是吗?如果你有两个标签连接到同一台服务器,他们都会收到消息通知,不是吗? –

+0

每个选项卡在服务器上都有单独的连接和套接字标识。因此,如果您想为特定会话或用户发送消息给所有套接字,则需要将该用户映射回多个套接字。 – Matt

如果代码在你的两个选项卡合作,有可能从一个标签与其他标签WebSocket连接共享数据。当一个选项卡打开时,它必须找出是否有任何其他选项卡已经打开了现有的webSocket连接,然后它将不得不要求该选项卡与新选项卡共享其数据。这不是一个简单的操作,因为浏览器窗口没有简单的方法来查找其他浏览器窗口,除非新窗口由前窗口的脚本打开,而不是由用户打开。但是,如果你的每个窗口只是试图建立一个到服务器的webSocket连接,它们将分别获得它们自己的webSocket连接。选项卡之间没有自动共享webSocket连接。这个通常的行为是,每个窗口只是获得自己的webSocket连接到服务器,然后服务器只是分别与每个浏览器窗口进行通信。如果来自一个窗口的某些信息需要与其他窗口保持同步,那么您可以编写服务器的代码以保持这两种方式的最新状态。

每个选项卡都有一个单独的连接到服务器,并具有唯一的套接字ID。

如果你想发送消息到每个套接字的用户ID或会话ID,你需要有东西来映射一个用户或会话到它的多个套接字连接。

在Socket.IO中,他们有一个概念"room"

connection您可以将套接字添加到room。此示例使用passport.js auth用户名进行分组。

io.on('connection', function(socket){ 
    socket.join(socket.request.user.username); 
}); 

然后,您可以发送消息给该房间的所有套接字。

io.to(username).emit('some event'): 

Socket.IO为您清理房间disconnect

https://github.com/cayasso/engine.io-rooms是可能有用的engine.io房间的实现。

简单来说

  • 在连接时,要在新的socket加入到插座的用户列表。
  • 断开连接时,您想要从用户的套接字列表中删除套接字。
  • 在发出时,您想要向用户列表中的所有套接字发送消息。