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

时间:2016-06-09 03:50:30

标签: javascript node.js sockets websocket primus

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

其他人已经提到过使用localStorage作为在不同标签上共享/传递相同数据的方法,但我发现它并不整洁。

非常感谢您的帮助。

最佳,

2 个答案:

答案 0 :(得分:1)

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

如果要向每个套接字发送消息以获取用户标识或会话标识,则需要将某个用户或会话映射到其多个套接字连接。

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

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

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的房间实现,可能很有用。

简单来说

  • 在连接时,您希望将新套接字添加到用户的套接字列表中。
  • 断开连接时,您希望从用户的套接字列表中删除套接字。
  • 在发出时,您希望向用户的列表中的所有套接字发送消息。

答案 1 :(得分:0)

如果两个选项卡中的代码配合,则可以使用另一个选项卡在一个选项卡中共享来自webSocket连接的数据。当一个选项卡打开时,它必须找出是否已经使用现有的webSocket连接打开了任何其他选项卡,然后它必须要求该选项卡与新选项卡共享其数据。这不是一个简单的操作,因为浏览器窗口没有简单的方法来查找其他浏览器窗口,除非新窗口是由前一个窗口的脚本打开的,而不是由用户打开。

但是,如果您的每个窗口只是尝试与服务器建立webSocket连接,那么它们将各自获得自己的webSocket连接。标签之间没有自动共享webSocket连接。

仅供参考,这里通常的行为是每个窗口只有自己的webSocket连接到服务器,然后服务器只是与每个浏览器窗口分别通信。如果一个窗口中的某些信息需要与另一个窗口保持同步,那么您可以对服务器进行编码,以便以这种方式保持最新状态。