1

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

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

非常感谢您的帮助。

最好的,

4

2 回答 2

1

每个选项卡都将与服务器建立单独的连接,并具有唯一的套接字 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 的房间实现,可能有用。

简单来说

  • 在连接时,您希望将新套接字添加到用户的套接字列表中。
  • 断开连接时,您希望从用户的套接字列表中删除该套接字。
  • 在发出时,您希望向用户列表中的所有套接字发出消息。
于 2016-06-09T04:56:38.960 回答
0

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

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

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

于 2016-06-09T04:32:51.130 回答