Mari kita bincangkan tentang cara melaksanakan SSE dalam Go? Apa yang perlu saya perhatikan?

藏色散人
Lepaskan: 2023-02-24 19:42:50
ke hadapan
4877 orang telah melayarinya

Artikel ini membawakan anda pengetahuan yang berkaitan tentang Go terutamanya tentang cara Go melaksanakan SSE dan perkara yang perlu diberi perhatian Rakan-rakan yang berminat boleh melihatnya bersama-sama. Semua orang membantu.

Mari kita bincangkan tentang cara melaksanakan SSE dalam Go? Apa yang perlu saya perhatikan?

1. Kod pelayan

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)
}
Salin selepas log masuk

Kod pelanggan

    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);
    };
Salin selepas log masuk

3. Nota (Penting)

Jika pelayan menyediakan parameter event (mesej lengkap termasuk id, data, acara), maka pelanggan perlu Gunakan addEventListener untuk mendengar acara ini secara eksplisit untuk mendapatkan mesej secara normal, jika tidak, acara tidak akan dicetuskan. Jika pelayan tidak menyediakan event parameter, hanya id、data, dsb., anda boleh menggunakan onmessage panggil balik untuk mendengar mesej:

Senario 1: Pelayan mempunyai event parameter dan mentakrifkan parameter yang dipanggil ping Peristiwa khusus

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);
};
Salin selepas log masuk

Senario 2: Data yang dikembalikan oleh pelayan tidak mengandungi 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);
  };
Salin selepas log masuk

[Pembelajaran yang disyorkan: pergi tutorial video]                                                                                                                       

Atas ialah kandungan terperinci Mari kita bincangkan tentang cara melaksanakan SSE dalam Go? Apa yang perlu saya perhatikan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:learnku.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan