亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

服務器發送事件 Golang

服務器發送事件 Golang

Go
桃花長相依 2021-10-18 17:07:29
我想做某種方式的數據流,并且正在試驗 SSE 與 Websockets。使用 SSE 形成 golang 服務器,我發現在會話完成時如何通知客戶端令人困惑。(例如,服務器已完成事件發送或服務器突然離線或客戶端失去連接)我需要做的一件事是可靠地知道這些斷開連接的情況。不使用超時等。到目前為止我的實驗,當我使服務器脫機時,客戶端會獲得 EOF。但是我在試圖弄清楚如何從服務器向客戶端發出連接關閉/完成的信號,然后如何處理/讀取它時遇到了麻煩?EOF 是確定關閉/錯誤/完成狀態的可靠方法嗎?許多 SSE 示例未能顯示客戶端良好的客戶端連接處理。使用 Websockets 會更容易嗎?任何經驗建議最受贊賞。
查看完整描述

1 回答

?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

SSE 標準要求瀏覽器在 N 秒后自動重新連接,如果連接丟失或服務器故意關閉套接字。(N 在 Firefox 中默認為 5,在 Chrome 和 Safari 中默認為 3,我上次檢查過。)所以,如果這是可取的,您不需要做任何事情。(在 WebSockets 中,您必須自己實現這種重新連接。)


如果那樣的重新連接的是不理想的,則應該將消息發送回客戶端,稱“節目一結束,走開”。例如,如果您正在流式傳輸財務數據,您可能會在周五晚上市場關閉時發送該數據。然后,客戶端應該攔截此消息并從其一側關閉連接。(然后套接字將消失,因此服務器進程將自動關閉。)


在 JavaScript 中,假設您使用 JSON 發送數據,它看起來像:


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);

更新:


您可以通過偵聽“關閉”事件,然后查看重新連接的發生時間來了解 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.");

  }

沒有其他信息可用,但更重要的是,它無法區分服務器進程故意關閉連接、Web 服務器崩潰或客戶端的 Internet 連接中斷。


您可以自定義的另一件事是重試時間,通過讓服務器發送retry:NN消息。因此,如果您不想快速重新連接,而是希望在任何重新連接嘗試之間至少間隔 60 秒,請執行此操作讓您的服務器發送retry:60.


查看完整回答
反對 回復 2021-10-18
  • 1 回答
  • 0 關注
  • 220 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號