繁体   English   中英

有没有一种方法可以在浏览器选项卡之间共享套接字连接

[英]Is there a way to share socket connection between browser tabs

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

其他人提到过使用localStorage作为在不同选项卡之间共享/通信相同数据的方法,但是我只是觉得它并不整洁。

非常感谢您的帮助。

最好,

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

如果要向每个套接字发出有关用户ID或会话ID的消息,则需要一些东西来将用户或会话映射到其多个套接字连接。

在Socket.IO中,它们具有“房间”的概念。

connection您可以将插座添加到房间中 本示例将使用passport.js认证的用户名进行分组。

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

简单来说

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM