>  기사  >  백엔드 개발  >  Go에서 SSE를 구현하는 방법에 대해 이야기해 볼까요? 무엇에 주의해야 합니까?

Go에서 SSE를 구현하는 방법에 대해 이야기해 볼까요? 무엇에 주의해야 합니까?

藏色散人
藏色散人앞으로
2023-02-24 15:54:224877검색

이 기사에서는 Go가 SSE를 구현하는 방법과 주의해야 할 사항에 대해 주로 설명합니다. 관심 있는 친구들은 아래를 살펴보는 것이 도움이 되기를 바랍니다.

Go에서 SSE를 구현하는 방법에 대해 이야기해 볼까요? 무엇에 주의해야 합니까?

1. 서버 코드

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. 클라이언트 코드

    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. 참고사항(중요)

서버가 event 매개변수를 제공하는 경우(전체 메시지에 ID, 데이터 및 이벤트가 포함되어 있는 경우) 클라이언트는 메시지를 정상적으로 가져오기 위해 addEventListener를 사용하여 이 이벤트를 명시적으로 수신해야 합니다. 그렇지 않으면 이벤트가 트리거되지 않습니다. 서버가 event 매개변수를 제공하지 않고 id, data 등만 제공하는 경우 onmessage 콜백을 사용하여 메시지를 수신할 수 있습니다. 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

시나리오 1: 서버에 event 매개변수가 있고 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);
  };
시나리오 2: 서버에서 반환된 데이터에 이벤트가 포함되어 있지 않습니다. rrreee [추천 학습: go 동영상 튜토리얼

]🎜               🎜 ~

위 내용은 Go에서 SSE를 구현하는 방법에 대해 이야기해 볼까요? 무엇에 주의해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제