2016-06-09 81 views
0

有些人已經在其他地方問過這個問題,我只是不確定它是否存在於這裏。無論如何,我使用Primus.ioengine.io,因爲它是變壓器。我想知道是否有可能在瀏覽器(客戶端)上共享websocket連接。就像我連接一個客戶端並在另一個選項卡上連接另一個客戶端一樣。理想情況下,他們應該得到相同的連接,如果我通過套接字發送的東西,兩個標籤應該能夠得到消息。有沒有辦法共享瀏覽器標籤之間的套接字連接

其他人提到過使用localStorage作爲在不同標籤上共享/傳遞相同數據的一種方式,但我不覺得它整潔。

非常感謝您的幫助。

最佳,

+0

這就是套接字的工作方式,不是嗎?如果你有兩個標籤連接到同一臺服務器,他們都會收到消息通知,不是嗎? –

+0

每個選項卡在服務器上都有單獨的連接和套接字標識。因此,如果您想爲特定會話或用戶發送消息給所有套接字,則需要將該用戶映射回多個套接字。 – Matt

回答

0

如果代碼在你的兩個選項卡合作,有可能從一個標籤與其他標籤WebSocket連接共享數據。當一個選項卡打開時,它必須找出是否有任何其他選項卡已經打開了現有的webSocket連接,然後它將不得不要求該選項卡與新選項卡共享其數據。這不是一個簡單的操作,因爲瀏覽器窗口沒有簡單的方法來查找其他瀏覽器窗口,除非新窗口由前窗口的腳本打開,而不是由用戶打開。但是,如果你的每個窗口只是試圖建立一個到服務器的webSocket連接,它們將分別獲得它們自己的webSocket連接。選項卡之間沒有自動共享webSocket連接。這個通常的行爲是,每個窗口只是獲得自己的webSocket連接到服務器,然後服務器只是分別與每個瀏覽器窗口進行通信。如果來自一個窗口的某些信息需要與其他窗口保持同步,那麼您可以編寫服務器的代碼以保持這兩種方式的最新狀態。

1

每個選項卡都有一個單獨的連接到服務器,並具有唯一的套接字ID。

如果你想發送消息到每個套接字的用戶ID或會話ID,你需要有東西來映射一個用戶或會話到它的多個套接字連接。

在Socket.IO中,他們有一個概念"room"

connection您可以將套接字添加到room。此示例使用passport.js auth用戶名進行分組。

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房間的實現。

簡單來說

  • 在連接時,要在新的socket加入到插座的用戶列表。
  • 斷開連接時,您想要從用戶的套接字列表中刪除套接字。
  • 在發出時,您想要向用戶列表中的所有套接字發送消息。
相關問題