站长资讯网
最全最丰富的资讯网站

聊聊Go怎么实现SSE?需要注意什么?

本篇文章给大家带来了关于Go的相关知识,其中主要跟大家聊一聊Go用什么方式实现SSE,以及需要注意的事项,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。

聊聊Go怎么实现SSE?需要注意什么?

一、服务端代码

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,结尾必须使用nn          fmt.Fprintf(rw, "id: %dnevent: ping ndata: %dnn", 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) }
登录后复制

二、客户端代码

    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参数(完整的消息包含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

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);   };
登录后复制

【推荐学习:go视频教程】

赞(0)
分享到: 更多 (0)