有些人已经在其他地方问了这个问题,我只是不确定它是否存在于此。无论如何,我使用Primus.io
和engine.io
作为变换器。我想知道是否可以在浏览器(客户端)上共享websocket连接。就像我连接一个客户端并在另一个选项卡上连接另一个客户端一样。理想情况下,他们应该获得相同的连接,如果我通过套接字发送内容,两个选项卡应该能够获取消息。
其他人已经提到过使用localStorage
作为在不同标签上共享/传递相同数据的方法,但我发现它并不整洁。
非常感谢您的帮助。
最佳,
答案 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连接到服务器,然后服务器只是与每个浏览器窗口分别通信。如果一个窗口中的某些信息需要与另一个窗口保持同步,那么您可以对服务器进行编码,以便以这种方式保持最新状态。