当前位置: 首页 > news >正文

gin实现event stream

event stream是属于http的一种通信方式,可以实现服务器主动推送。原理于客户端请求服务器之后一直保持链接,服务端持续返回结果给客户端。相比较于websocket有如下区别:

  1. 基于http的通信方式,在各类框架的加持下不需要开发人员自己维护链接状态,而websocket一般需要开发自己维护客户端链接(一般是一个map)
  2. 也是因为基于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()}
}
http://www.lryc.cn/news/186222.html

相关文章:

  • pytorch中transform库中常用的函数有哪些及其用法?
  • 抖音手机实景无人直播间怎么搭建?
  • 【新书推荐】当 Python 遇到 ChatGPT —— 自动化办公落地
  • RSA攻击:Smooth攻击
  • 什么是位域和位段?如何定义和使用位域?
  • 网络攻防备课笔记
  • Apache Solr9.3 快速上手
  • 按关键字搜索淘宝商品API接口获取商品销量、优惠价、商品标题等参数示例
  • 【外汇天眼】价格波动的节奏感:优化止盈方法!
  • VMvare虚拟机安装国产麒麟V10桌面操作系统
  • Golang--channel+waitGroup控制并发量
  • 前端【响应式图片处理】之 【picture标签】
  • js实现链式调用,查询和处理数据
  • 阿里云 腾讯云 配置二级域名并解析指向非80端口操作指南
  • 菜单子节点的写法
  • 系统架构设计:9 论软件系统架构评估及其应用
  • javaee SpringMVC中json的使用
  • 【系统架构】软件架构的演化和维护
  • 一盏茶的功夫帮你彻底搞懂JavaScript异步编程从回调地狱到async/await
  • 前后端分离计算机毕设项目之基于SpringBoot的无人智慧超市管理系统的设计与实现《内含源码+文档+部署教程》
  • 从0开始python学习-31.selenium 文本输入框、下拉选择框、文件上传、时间插件选择元素定位
  • MyCat-web安装文档:安装Zookeeper、安装Mycat-web
  • Ajax跨域访问,访问成功但一直走error不走success的的问题解决
  • 水星 Mercury MIPC251C-4 网络摄像头 ONVIF 与 PTZ 云台控制
  • Reactor 模式网络服务器【I/O多路复用】(C++实现)
  • 2019年[海淀区赛 第2题] 阶乘
  • CMM—软件企业走向世界的通行证
  • 基于FPGA的图像形态学腐蚀算法实现,包括tb测试文件和MATLAB辅助验证
  • 华为云云耀云服务器L实例评测|RabbitMQ的Docker版本安装 + 延迟插件安装 QQ邮箱和阿里云短信验证码的主题模式发送
  • 解决Linux安装AppImage文件chrome-sandbox出错问题