【问题标题】:Is there a way to share socket connection between browser tabs [duplicate]有没有办法在浏览器选项卡之间共享套接字连接[重复]
【发布时间】:2016-06-09 13:10:04
【问题描述】:

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

其他人提到过使用localStorage 作为在不同选项卡之间共享/交流相同数据的一种方式,但我觉得它并不整洁。

非常感谢您的帮助。

最好的,

【问题讨论】:

  • 这就是套接字的工作方式,不是吗?如果您有两个选项卡连接到同一台服务器,它们都会收到消息通知,不是吗?
  • 每个选项卡在服务器上都有一个单独的连接和套接字 ID。因此,如果您想向特定会话或用户的所有套接字发送消息,则需要将该用户映射回多个套接字。

标签: javascript node.js sockets websocket primus


【解决方案1】:

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

如果您想为用户 ID 或会话 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 的房间实现,可能有用。

简单来说

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

【讨论】:

    【解决方案2】:

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

    但是,如果您的每个窗口都只是尝试与服务器建立 webSocket 连接,它们将各自获得自己的 webSocket 连接。选项卡之间不会自动共享 webSocket 连接。

    仅供参考,这里的通常行为是每个窗口只获得自己的与服务器的 webSocket 连接,然后服务器只与每个浏览器窗口单独通信。如果一个窗口中的某些信息需要与另一个窗口保持同步,那么您可以对您的服务器进行编码以使两者保持最新。

    【讨论】:

      猜你喜欢
      • 2011-04-27
      • 2019-04-27
      • 2012-03-22
      • 1970-01-01
      • 2012-08-22
      • 2013-10-08
      • 2012-10-10
      • 2014-11-14
      相关资源
      最近更新 更多