2012-03-06 22 views
10

有沒有辦法在一個頁面上打開一個websocket,然後在另一個頁面上重用它(例如在用戶點擊一個鏈接後,在同一個選項卡中),而不必在每次頁面加載後打開一個新的websocket?瀏覽器存儲能夠保持在開放式套接字上嗎?在頁面之間重用websockets?

其目的是爲了能夠保持每個用戶(或選項卡)的一個websocket,這將是很好的做到這一點,而不需要以非傳統的方式在頁面之間移動,例如使用加載內容到div Javascrpt每次用戶與頁面交互時。

+1

當創建websocket連接時,連接的兩端都必須跟蹤連接的存在狀態。我認爲,如果你將連接的客戶端狀態存儲在本地存儲中(請注意,必須修改websocket系統的客戶端以允許這個大多數甚至所有的websocket客戶端不會支持這一點,據我所知),你可能能夠重新打開後者的連接,甚至可以在另一個頁面上重新打開連接(只要服務器沒有丟失其狀態的一半)。所以這一定是可能的,但如何?我希望看到一個工作示例。 – 2012-03-06 06:50:43

+0

我想像「重新創建」Web服務器一樣,服務器也必須支持它。或者更特別的是用於在服務器上實現websocket支持的庫。我懷疑當服務器檢測到底層TCP連接已關閉時,服務器上的大多數實現都會結束WebSocket - 儘管對您建議的客戶端進行的更改可以使其保持打開狀態。 – 2012-03-06 09:36:14

+3

是的,**一個websocket連接沒有出現作爲transport **創建的tcp連接,好吧,我認爲它們更聰明。 – 2012-03-06 10:23:12

回答

7

答案是沒有

即使插座未明確致電mySocket.close();關閉,套接字將通過重新加載瀏覽器被關閉。

我試圖存儲到本地存儲在Web Socket對象,並用它來再次檢索數據。返回的對象是有效的,但連接不再存在。因爲,當頁面重新加載時,套接字被非正常終止。在服務器端

消息稱:

[Errno 10053] An established connection was aborted by the software in your host machine 

你去那裏...

+0

我很好奇,如果你把websocket(或引用)放入本地存儲,會發生什麼。感謝您嘗試解決這個謎題。 – 2013-02-14 00:22:00

2

共享Web工人將允許你分享對於那些來自同一產地/網站加載多個選項卡的WebSocket連接。

共享Web工人目前僅支持Chrome, Safari, Opera

+0

對不起,我的問題還不夠清楚。當我說不同的頁面時,我應該在同一個選項卡中指定。我編輯了我的問題,希望能夠更清楚地說明問題。儘管如此,感謝您的光臨。 – 2012-03-07 03:44:16

+0

@Joshua:啊,那你問的問題和我剛纔問的一樣:http://stackoverflow.com/questions/9336774/do-shared-web-workers-persist-across-a-single-page -reload-link-navigation/9337749對於這個問題還沒有明確的答案,我打算在某些時候測試一下,看它是否適用於Chrome/Safari。 – kanaka 2012-03-07 14:06:34

+0

是的,這些問題是類似的,除了我希望也許有什麼不同的websockets,這意味着我可能會得到不同的答案。 – 2012-03-08 04:27:00

7

一個不同的方法將保持用戶的,而不是在不同的頁面插座。我的意思是說,你將客戶端的ID存儲在一個帶有javascript的cookie中,每當用戶嘗試從你的任何網站頁面打開一個新的套接字時,你就會把這個ID發送到服務器,然後服務器就有辦法知道這個新的連接來自同一個用戶。

我已經做了,在最近的一個項目,它完美地工作:)取決於你打算做什麼,你可以保持用戶的狀態,您的服務器上有他的身份證,或將其存放在其他的cookie或事件使用閃存將其存儲在共享對象中!

+0

是的,這完全有可能,並且將是一個完美有效的解決方案(我們討論過一個),但底層架構依賴於websocket保持打開狀態以滿足某些功能需求。當然,打開和關閉套接字可能會導致的問題可能已經得到緩解,但最終決定保持套接字處於打開狀態並根據URL的位置屬性動態加載內容。不知道這是更好的方式,但c'est la vie。 – 2013-02-13 23:50:26

+0

@WiMantis你在服務器端使用websocket的連接管理器? – 2014-04-03 03:20:31