Heim >Backend-Entwicklung >Golang >Lassen Sie uns darüber sprechen, wie man SSE in Go implementiert. Worauf sollte ich achten?
In diesem Artikel erfahren Sie, wie Go SSE implementiert und worauf Sie achten müssen. Ich hoffe, dass er Ihnen weiterhilft.
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('http://127.0.0.1:8080/sse'); source.onopen = () => { console.log('链接成功'); }; source.addEventListener("ping",function(res){ console.log('获得数据:' + 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('http://127.0.0.1:8080/sse'); source.onopen = () => { console.log('链接成功'); }; source.addEventListener("ping",function(res){ console.log('获得的数据是:' + res.data); }) source.onerror = (err) => { console.log(err); };
场景二:服务器返回的数据不包含event
event
und definiert ein bestimmtes Ereignis namens ping
const source = new EventSource('http://127.0.0.1:8080/sse'); source.onopen = () => { console.log('链接成功'); }; source.onmessage(function(res){ console.log('获得的数据是:' + 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!