2016-09-17 61 views
0

我在我的主要佈局的HTML以下代碼插座IO單獨的JavaScript聽者

var baseUrl = "{{ env('SOCKET_BASE_URL') }}"; 
var socket = io.connect(baseUrl + ':3000'); 
socket.on("message-channel:App\\Events\\BroadcastMessageToUser", function(message){ 
    // alert the user about the message 
}); 

我的問題是,有時當被髮射的一個消息,並及時,用戶接收該消息刷新或點擊的鏈接;該消息將被該聽衆錯過(該消息將永遠不會被接收,但會被髮送)

現在我認爲,如果可以將此偵聽器分開以便即使刷新了選項卡或用戶單擊了鏈接,這個監聽器不會被刷新,它仍然會被連接到接收消息。謝謝。

回答

1

這是不正確的。 Socket.io只有傳輸信息,它不是堅持它。爲了確保信息保留在新的HTTP請求上,您需要將所有消息存儲在數據庫,文件系統或其他更永久的介質中。

+0

好的謝謝你澄清。 :) – Wreigh

1

您無法「將聽衆與標籤分開」。當刷新瀏覽器頁面時,所有webSocket連接都將關閉,並釋放與該頁面關聯的所有狀態。在刷新頁面時,您無法保持該頁面的webSocket/socket.io連接處於打開狀態。

向所有連接的客戶端廣播的socket.io方法僅向當時連接的所有客戶端發送。如果您希望將來可能連接很短時間的客戶也收到特定的消息,則必須保存該消息並在下次連接時將其發送給這些客戶端。

假設你有一些方法來識別每個用戶的連接,你可以跟蹤用戶什麼時候斷開他們的socket.io連接,然後如果你很快看到連接事件,你可以給他們發送任何他們想要的消息當他們重新連接時錯過了。您必須維護某種最近消息的列表,最近斷開連接的客戶端列表,並且可能使用某種事件計數器,以便您可以知道發送新重新連接的客戶端的事件。