이 기사에서는 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('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. 참고사항(중요)
서버가 event
매개변수를 제공하는 경우(전체 메시지에 ID, 데이터 및 이벤트가 포함되어 있는 경우) 클라이언트는 메시지를 정상적으로 가져오기 위해 addEventListener
를 사용하여 이 이벤트를 명시적으로 수신해야 합니다. 그렇지 않으면 이벤트가 트리거되지 않습니다. 서버가 event
매개변수를 제공하지 않고 id, data
등만 제공하는 경우 onmessage
콜백을 사용하여 메시지를 수신할 수 있습니다. 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
매개변수가 있고 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); };
이벤트가 포함되어 있지 않습니다.
rrreee
[추천 학습: go 동영상 튜토리얼]🎜 🎜
~위 내용은 Go에서 SSE를 구현하는 방법에 대해 이야기해 볼까요? 무엇에 주의해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!