Maison >développement back-end >Golang >Parlons de la façon d'implémenter SSE dans Go ? A quoi dois-je faire attention ?

Parlons de la façon d'implémenter SSE dans Go ? A quoi dois-je faire attention ?

藏色散人
藏色散人avant
2023-02-24 15:54:224919parcourir

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.

Parlons de la façon d'implémenter SSE dans Go ? A quoi dois-je faire attention ?

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(&#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. 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(&#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

Scénario 1 : Le serveur a le paramètre event et définit un événement spécifique appelé 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);
  };
Scénario 2 : Les données renvoyées par le serveur ne contiennent pas 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer