Cet article vous apporte des connaissances pertinentes sur Go. Il explique principalement comment Go implémente SSE et ce à quoi vous devez prêter attention. J'espère que cela vous sera utile.
1. Code serveur
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. Code client
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. Notes (important)
Si le serveur fournit le paramètre event
(Le le message inclut l'identifiant, les données et l'événement), alors le client doit utiliser addEventListener
pour écouter explicitement cet événement afin d'obtenir le message normalement, sinon l'événement ne sera pas déclenché. Si le serveur ne fournit pas de paramètres event
, seulement id, data
, etc., vous pouvez utiliser le rappel onmessage
pour écouter les messages : 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
et définit un événement spécifique appelé 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); };
event
rrreee
[Apprentissage recommandé : tutoriel vidéo go]🎜 🎜
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!