首頁 > 後端開發 > Golang > 聊聊Go怎麼實作SSE?需要注意什麼?

聊聊Go怎麼實作SSE?需要注意什麼?

藏色散人
發布: 2023-02-24 19:42:50
轉載
4922 人瀏覽過

這篇文章為大家帶來了關於Go的相關知識,其中主要跟大家聊一聊Go用什麼方式實現SSE,以及需要注意的事項,有興趣的朋友下面一起來看一下吧,希望對大家有幫助。

聊聊Go怎麼實作SSE?需要注意什麼?

一、服務端程式碼

package main

import (
   "fmt"
   "net/http"
   "time"
)

type SSE struct {
}

func (sse *SSE) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
   flusher, ok := rw.(http.Flusher)
   if !ok {
      http.Error(rw, "Streaming unsupported!", http.StatusInternalServerError)
      return
   }

   rw.Header().Set("Content-Type", "text/event-stream")
   rw.Header().Set("Cache-Control", "no-cache")
   rw.Header().Set("Connection", "keep-alive")
   rw.Header().Set("Access-Control-Allow-Origin", "*")
   for {
      select {
      case <-req.Context().Done():
         fmt.Println("req done...")
         return
      case <-time.After(500 * time.Millisecond):
         // 返回数据包含id、event(非必须)、data,结尾必须使用\n\n
         fmt.Fprintf(rw, "id: %d\nevent: ping \ndata: %d\n\n", time.Now().Unix(), time.Now().Unix())
         flusher.Flush()
      }
   }

}

func SendData(data chan int64) chan int64 {
   for {
      data <- time.Now().Unix()
      time.Sleep(time.Second * time.Duration(2))
   }
}
func main() {
   http.Handle("/sse", &SSE{})
   http.ListenAndServe(":8080", nil)
}
登入後複製

二、客戶端程式碼

    const source = new EventSource(&#39;http://127.0.0.1:8080/sse&#39;);
    source.onopen = () => {
        console.log(&#39;链接成功&#39;);
    };
    source.addEventListener("ping",function(res){
         console.log(&#39;获得数据:&#39; + res.data);
    })
    source.onerror = (err) => {
        console.log(err);
    };
登入後複製

三、注意事項(重要)

如果伺服器端提供了event參數(完整的訊息包含id、data、event),那麼客戶端就需要使用addEventListener 明確監聽這個事件,才會正常取得訊息,否則事件不會觸發。如果伺服器端沒有提供event 參數,只有id、data等,可以使用onmessage回呼監聽訊息:

場景一:伺服器有event 參數,並且定義了一個叫ping 的具體事件

const source = new EventSource(&#39;http://127.0.0.1:8080/sse&#39;);
source.onopen = () => {
    console.log(&#39;链接成功&#39;);
};
source.addEventListener("ping",function(res){
     console.log(&#39;获得的数据是:&#39; + res.data);
})
source.onerror = (err) => {
    console.log(err);
};
登入後複製

場景二:伺服器傳回的資料不包含event

const source = new EventSource(&#39;http://127.0.0.1:8080/sse&#39;);
  source.onopen = () => {
      console.log(&#39;链接成功&#39;);
  };
  source.onmessage(function(res){
       console.log(&#39;获得的数据是:&#39; + res.data);
  })
  source.onerror = (err) => {
      console.log(err);
  };
登入後複製

【建議學習:go影片教學                    #                            

以上是聊聊Go怎麼實作SSE?需要注意什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板