1 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊
SSE 標(biāo)準(zhǔn)要求瀏覽器在 N 秒后自動(dòng)重新連接,如果連接丟失或服務(wù)器故意關(guān)閉套接字。(N 在 Firefox 中默認(rèn)為 5,在 Chrome 和 Safari 中默認(rèn)為 3,我上次檢查過(guò)。)所以,如果這是可取的,您不需要做任何事情。(在 WebSockets 中,您必須自己實(shí)現(xiàn)這種重新連接。)
如果那樣的重新連接的是不理想的,則應(yīng)該將消息發(fā)送回客戶端,稱“節(jié)目一結(jié)束,走開”。例如,如果您正在流式傳輸財(cái)務(wù)數(shù)據(jù),您可能會(huì)在周五晚上市場(chǎng)關(guān)閉時(shí)發(fā)送該數(shù)據(jù)。然后,客戶端應(yīng)該攔截此消息并從其一側(cè)關(guān)閉連接。(然后套接字將消失,因此服務(wù)器進(jìn)程將自動(dòng)關(guān)閉。)
在 JavaScript 中,假設(shè)您使用 JSON 發(fā)送數(shù)據(jù),它看起來(lái)像:
var es = EventSource("/datasource");
es.addEventListener("message", function(e){
var d = JSON.parse(e.data);
if(d.shutdownRequest){
es.close();
es=null;
//Tell user what just happened.
}
else{
//Normal processing here
}
},false);
更新:
您可以通過(guò)偵聽“關(guān)閉”事件,然后查看重新連接的發(fā)生時(shí)間來(lái)了解 e.target.readyState
es.addEventListener("error", handleError, false);
function handleError(e){
if(e.target.readyState == 0)console.log("Reconnecting...");
if(e.target.readyState == 2)console.log("Giving up.");
}
沒有其他信息可用,但更重要的是,它無(wú)法區(qū)分服務(wù)器進(jìn)程故意關(guān)閉連接、Web 服務(wù)器崩潰或客戶端的 Internet 連接中斷。
您可以自定義的另一件事是重試時(shí)間,通過(guò)讓服務(wù)器發(fā)送retry:NN消息。因此,如果您不想快速重新連接,而是希望在任何重新連接嘗試之間至少間隔 60 秒,請(qǐng)執(zhí)行此操作讓您的服務(wù)器發(fā)送retry:60.
- 1 回答
- 0 關(guān)注
- 219 瀏覽
添加回答
舉報(bào)