教育中介公司网站建设费用,绵阳网站建设软件有哪些,填手机号码的广告,软件推广怎么做event stream是属于http的一种通信方式#xff0c;可以实现服务器主动推送。原理于客户端请求服务器之后一直保持链接#xff0c;服务端持续返回结果给客户端。相比较于websocket有如下区别#xff1a;
基于http的通信方式#xff0c;在各类框架的加持下不需要开发人员自己…event stream是属于http的一种通信方式可以实现服务器主动推送。原理于客户端请求服务器之后一直保持链接服务端持续返回结果给客户端。相比较于websocket有如下区别
基于http的通信方式在各类框架的加持下不需要开发人员自己维护链接状态而websocket一般需要开发自己维护客户端链接(一般是一个map)也是因为基于http客户端请求之后便处于接收状态(发送信道关闭)所以只能接收服务端推送而不能客户端推送比较适合用作通知等场景。
以gin框架为例实现
func TestEventStream(c *gin.Context) {// 声明数据格式为event streamc.Writer.Header().Set(Content-Type, text/event-stream)c.Writer.Header().Set(Cache-Control, no-cache)c.Writer.Header().Set(Connection, keep-alive)// 禁用nginx缓存,防止nginx会缓存数据导致数据流是一段一段的c.Writer.Header().Set(X-Accel-Buffering, no)w : c.Writerflusher, _ : w.(http.Flusher)flusher.Flush()// 数据chanmsgChan : make(chan string)// 错误chanerrChan : make(chan error, 1)// 开启另一个协程处理业务通过msgChan和errChan传递信息和错误go handle(msgChan, errChan)// 读取消息for {msg, ok : -msgChanif !ok {break}fmt.Fprintf(w, event: message\n)fmt.Fprintf(w, data: %s\n\n, msg)flusher.Flush()}// 检查错误for {err, ok : -errChanif !ok {return}fmt.Println(err)fmt.Fprintf(w, event: error\n)fmt.Fprintf(w, data: %s\n\n, err.Error())flusher.Flush()}
}//逻辑处理,读取文件中每一行的内容返回给eventstream
func handle(msgChan chan string, errChan chan error) {defer func() {if r : recover(); r ! nil {errChan - errors.New(system panic)}close(msgChan)close(errChan)}()file, err : os.Open(temp.txt)if err ! nil {errChan - errreturn}scanner : bufio.NewScanner(file)for scanner.Scan() {msgChan - scanner.Text()}
}