Go に SSE を実装する方法について話しましょう?何に注意すればよいでしょうか?

藏色散人
リリース: 2023-02-24 19:42:50
転載
4878 人が閲覧しました

この記事では、Go に関する関連知識を紹介します。主に Go の SSE 実装方法と注意点について説明します。興味のある友達は一緒に見てください。お役に立てれば幸いです。みんな助かります。

Go に SSE を実装する方法について話しましょう?何に注意すればよいでしょうか?

#1. サーバー コード #

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)
}
ログイン後にコピー

2. クライアント コード #

    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);
    };
ログイン後にコピー

3. 注 (重要)

サーバーが

event パラメーター (完全なメッセージには ID、データ、イベントが含まれます) を提供する場合、クライアントは addEventListener を使用する必要があります。 このイベントを明示的にリッスンして、メッセージを正常に取得できるようにします。そうでない場合、イベントはトリガーされません。サーバーが event パラメーターを提供せず、id、data などのみを提供する場合は、onmessage コールバックを使用してメッセージをリッスンできます。

シナリオ 1: サーバーには

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);
};
ログイン後にコピー

という特定のイベントが定義されています。 シナリオ 2: サーバーから返されたデータには # が含まれていません。 ##イベント

うわぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁ [推奨される学習: ビデオ チュートリアルに進む

]

                                                                                                    

以上がGo に SSE を実装する方法について話しましょう?何に注意すればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート