Heim >Backend-Entwicklung >Golang >Lassen Sie uns darüber sprechen, wie man SSE in Go implementiert. Worauf sollte ich achten?

Lassen Sie uns darüber sprechen, wie man SSE in Go implementiert. Worauf sollte ich achten?

藏色散人
藏色散人nach vorne
2023-02-24 15:54:224920Durchsuche

In diesem Artikel erfahren Sie, wie Go SSE implementiert und worauf Sie achten müssen. Ich hoffe, dass er Ihnen weiterhilft.

Lassen Sie uns darüber sprechen, wie man SSE in Go implementiert. Worauf sollte ich achten?

1. Servercode

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. Client-Code

    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. Hinweise (wichtig)

Wenn der Server den Parameter event bereitstellt (Die vollständige Wenn die Nachricht ID, Daten und Ereignis enthält, muss der Client addEventListener verwenden, um dieses Ereignis explizit abzuhören und die Nachricht normal abzurufen. Andernfalls wird das Ereignis nicht ausgelöst. Wenn der Server keine event-Parameter, sondern nur id, data usw. bereitstellt, können Sie den onmessage-Callback verwenden, um auf Nachrichten zu warten: 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

Szenario 1: Der Server verfügt über den Parameter event und definiert ein bestimmtes Ereignis namens ping

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);
  };
Szenario 2: Die vom Server zurückgegebenen Daten enthalten kein event rrreee [Empfohlenes Lernen: Go-Video-Tutorial

]🎜               🎜                                                                               

Das obige ist der detaillierte Inhalt vonLassen Sie uns darüber sprechen, wie man SSE in Go implementiert. Worauf sollte ich achten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen