Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mari kita bincangkan tentang cara melaksanakan SSE dalam Go? Apa yang perlu saya perhatikan?

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

藏色散人
藏色散人ke hadapan
2023-02-24 15:54:224855semak imbas

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

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

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

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

[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!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam