golang如何实现sse

Server-Sent Events (SSE) 的实现主要是通过逐步读取 HTTP 响应体并以事件流的形式将数据推送到客户端。下面我会详细解释代码中如何实现 SSE。
SSE (Server-Sent Events) 简介
SSE 是一种在客户端与服务器之间建立单向持久连接的技术,允许服务器在有新数据时主动推送到客户端。与传统的 HTTP 请求-响应模型不同,SSE 使用一个持久连接来推送数据,而不需要客户端反复发起请求。
代码分析

1.设置响应头部:
服务器首先通过设置响应头,指定内容类型为 text/event-stream,并且禁用缓存、保持连接活跃:

   c.Writer.Header().Set("Content-Type", "text/event-stream")c.Writer.Header().Set("Cache-Control", "no-cache")c.Writer.Header().Set("Connection", "keep-alive")

2.Content-Type: text/event-stream 告诉浏览器这是一个 SSE 流。
3.Cache-Control: no-cache 禁止缓存,确保每次客户端接收到的是最新的事件数据。
4.Connection: keep-alive 确保 HTTP 连接在数据传输期间保持活跃。

5.发起 HTTP 请求:
SendChatRequestPlus 函数创建并发送了一个 HTTP POST 请求到 https://api.lingyiwanwu.com/v1/chat/completions,该请求的请求体是传入的 body 参数。请求的目的可能是请求一个聊天机器人服务的回答。

   req, err := http.NewRequest("POST", "https://api.lingyiwanwu.com/v1/chat/completions", bytes.NewBuffer(jsonData))

其中 jsonData 是将 body 序列化后的 JSON 数据。

6.处理响应:
请求发送后,代码等待来自服务端的响应。服务端返回的数据是逐行传送的,并且每行都以 data: 开头,这是 SSE 的标准格式。

   scanner := bufio.NewScanner(resp.Body)for scanner.Scan() {line := scanner.Text()if strings.HasPrefix(line, "data: ") {jsonData := strings.TrimPrefix(line, "data: ")// 进一步处理 jsonData}}

7.使用 bufio.Scanner 来逐行读取响应体,每一行可能包含一个 SSE 数据事件。
8.每一行数据以 data: 开头,后面是实际的 JSON 数据。
例如,如果响应体是这样:

   data: {"message": "Hello, world!"}data: {"message": "How are you?"}

这就意味着服务端通过 SSE 向客户端发送了两个消息。

9.解码 JSON 数据并格式化:
读取到每行 data: 后面的 JSON 数据后,将其解码为 responseBody,这是一个 map[string]interface{} 类型。

   if err := json.Unmarshal([]byte(jsonData), &responseBody); err != nil {c.String(http.StatusInternalServerError, "error decoding JSON: %s", err)return}

然后,将解码后的 responseBody 再次序列化为 JSON 格式,并通过 SSE 格式发送到客户端。

10.发送数据到客户端:
将格式化后的 JSON 数据通过 fmt.Fprintf 按 SSE 格式发送到客户端。注意,数据是以 data: <json_data>\n\n 这种格式发送的。

   eventData, err := json.Marshal(responseBody)if err != nil {c.String(http.StatusInternalServerError, "error marshalling response: %s", err)return}fmt.Fprintf(c.Writer, "data: %s\n\n", eventData)c.Writer.Flush() // 刷新响应流

11.data: %s\n\n 表示发送一个 SSE 消息,其中 data 是消息的内容。
12.c.Writer.Flush() 强制将响应刷新到客户端,确保消息实时传送。

13.控制发送频率:
在代码中,time.Sleep(1 * time.Second) 用来控制每次发送的频率。这里设置的是每秒钟发送一次事件。如果需要,可以调整这个时间间隔。

   time.Sleep(1 * time.Second)

14.处理错误:
在整个过程中,代码会处理可能出现的各种错误,例如 JSON 编码/解码错误、HTTP 请求错误、响应读取错误等。如果发生错误,服务器会返回相应的错误信息,并停止处理。

总结
在这段代码中,SSE 的实现核心是通过将服务器的响应逐行读取,并格式化为符合 SSE 协议的格式 (data: <json_data>\n\n) 推送给客户端。这种方法确保了服务器能够持续向客户端推送数据,而无需客户端持续发送请求。通过设置正确的响应头和适当的处理每一行 data: 数据,最终实现了 Server-Sent Events 的功能。
改进建议

15.错误处理:如果服务端响应的状态码不为 200 OK,可以在响应头中返回更详细的错误信息,而不仅仅是一个通用的错误消息。
16.连接管理:考虑到 SSE 的长连接特性,可能需要处理连接超时或客户端断开连接的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生信:TCGA学习(R、RStudio安装与下载、常用语法与常用快捷键)

前置环境 macOS系统&#xff0c;已安装homebrew且会相关命令。 近期在整理草稿区&#xff0c;所以放出该贴。 R语言、RStudio、R包安装 R语言安装 brew install rRStudio安装 官网地址&#xff1a;https://posit.co/download/rstudio-desktop/ R包下载 注意R语言环境自带…

elementUI input 禁止内容两端存在空格,或者是自动去除两端空格

需求 项目中有需求&#xff1a;输入框中禁止内容两端存在空格&#xff0c;或者是自动去除两端空格。 解决方法 vue的api文档中有过介绍&#xff0c;使用.trim可以去掉用户输入内容中两端的空格&#xff0c;如下图 代码 <el-input v-model.trim"name" cleara…

flink同步mysql数据表到pg库

1.关闭防火墙和selinux systemctl stop firewalld systemctl disable firewalld systemctl status firewalldvi /etc/selinux/config 修改为disabled2.安装java8 yum list java-1.8* yum install java-1.8.0-openjdk* -yjava -version3.下载和部署postgresql 下载地址&#…

HBase理论_HBase架构组件介绍

近来有些空闲时间&#xff0c;正好最近也在开发HBase相关内容&#xff0c;借此整理一下学习和对HBase组件的架构的记录和个人感受&#xff0c;付出了老夫不少心血啊&#xff0c;主要介绍的就是HBase的架构设计以及我的拓展内容。内容如有不当或有其他理解 matirx70163.com HB…

第九部分 :1.STM32之通信接口《精讲》(USART,I2C,SPI,CAN,USB)

本芯片使用的是STM32F103C8T6型号 STM32F103C8T6是STM32F1系列中的一种较常用的低成本ARM Cortex-M3内核MCU&#xff0c;具有丰富的通信接口&#xff0c;包括USART、SPI、I2C等。下面是该芯片上通信接口的管脚分布、每个接口的工作模式、常用应用场景和注意事项。 1. USART (通…

ODOO学习笔记(8):模块化架构的优势

灵活性与可定制性 业务流程适配&#xff1a;企业的业务流程往往因行业、规模和管理方式等因素而各不相同。Odoo的模块化架构允许企业根据自身的具体业务流程&#xff0c;选择和组合不同的模块。例如&#xff0c;一家制造企业可以启用采购、库存、生产和销售模块&#xff0c;并通…

MATLAB课程:AI工具辅助编程——MATLAB+LLMs

给出一些可能有用的方法辅助大家写代码。 方法一&#xff1a;MATLAB软件LLM (不太懂配置的同学们为了省事可以主要用这个方法) 方法一特别针对本门MATLAB教学课程&#xff0c;给出一种辅助ai工具的操作指南。MATLAB中可以安装MatGPT插件&#xff0c;该插件通过调用ChatGPT的API…

C++二叉平衡搜索树:AVL树的插入、删除与平衡

目录 引言 AVL树的概念 AVL树节点的定义 AVL树的插入 AVL树的基本结构 AVL树的插入 第一步&#xff1a;按搜索树的规则进行插入 第二步&#xff1a;更新平衡因子 1、父节点的平衡因子为 parent->bf 0 2、更新完 parent 的 bf&#xff0c;如果 parent->bf 1…

机器学习(1)

一、机器学习 机器学习&#xff08;Machine Learning, ML&#xff09;是人工智能&#xff08;Artificial Intelligence, AI&#xff09;的一个分支&#xff0c;它致力于开发能够从数据中学习并改进性能的算法和模型。机器学习的核心思想是通过数据和经验自动优化算法&#xff…

【Kafka】集成案例:与Spark大数据组件的协同应用

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《大数据前沿&#xff1a;技术与应用并进》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是kafka 2、Kafka 的主要特性 3、Kafka 的…

【卡尔曼滤波】递归算法Recursive的应用 C语言、Python实现(Kalman Filter)

【卡尔曼滤波】递归算法Recursive的应用 C语言、Python实现&#xff08;Kalman Filter&#xff09; 更新以gitee为准&#xff1a; gitee地址 文章目录 递归算法算术平均的递归算法例子卡尔曼滤波递归Python实现C语言实现与普通卡尔曼滤波的比较附录&#xff1a;压缩字符串、大…

python+pptx:(二)添加图片、表格、形状、模版渲染

目录 图片 表格 合并单元格 填充色、边距 写入数据 形状 模版渲染 上一篇&#xff1a;pythonpptx&#xff1a;&#xff08;一&#xff09;占位符、文本框、段落操作_python输出ppt母版占位符标号-CSDN博客 from pptx import Presentation from pptx.util import Cm, In…

【Windows】CMD命令学习——系统命令

CMD&#xff08;命令提示符&#xff09;是Windows操作系统中的一个命令行解释器&#xff0c;允许用户通过输入命令来执行各种系统操作。 系统命令 systeminfo - 显示计算机的详细配置信息。 tasklist - 显示当前正在运行的进程列表。 taskkill - 终止正在运行的进程。例如&am…

Java的栈与队列以及代码实现

Java栈和队列 栈的概念&#xff08;Stack&#xff09;栈的实现代码队列&#xff08;Queue&#xff09;模拟实现队列(双链表实现)循环队列&#xff08;循环数组实现&#xff09;用队列实现栈用栈来实现队列总结 栈的概念&#xff08;Stack&#xff09; 栈是常见的线性数据结构&…

Node.js is Web Scale

点击“打开/下载题目”进去看看情况&#xff1a; 为了方便查看翻译成中文简体来看&#xff1a; emmm&#xff0c;看不懂什么意思&#xff0c;查看源代码&#xff0c;js表示是一段JavaScript代码&#xff0c;丢给AI分析一下&#xff1a; // server.js const express require(&…

缓冲区溢出,数据被踩的案例学习

继续在ubuntu上学习GDB&#xff0c;今天要学习的是缓冲区溢出。 程序的地址&#xff1a; GitHub - gedulab/gebypass: bypass password by heap buffer overflow 编译的方法&#xff1a; gcc -g -O2 -o gebypass gebypass.c 照例设置一下科学shangwang代理&#xff1a; e…

数字人直播骗局大曝光!真假源码厂商搭部署的源码有何差异?

随着数字人直播技术的不断发展成熟&#xff0c;它所蕴含着的市场前景和收益潜力开始逐渐显化&#xff0c;使得有意向入局的人数持续增多的同时&#xff0c;也让不少骗子看到了可乘之机&#xff0c;从而炮制出了一个又一个的数字人直播骗局。 其中&#xff0c;最为经典的便是dai…

#渗透测试#SRC漏洞挖掘#云技术基础03之容器相关

目录 一、Podman相关 &#xff08;一&#xff09;Podman简介 &#xff08;二&#xff09;Pod相关操作 二、容器相关 &#xff08;一&#xff09;容器概念 &#xff08;二&#xff09;容器的历史发展 &#xff08;三&#xff09;Capabilities相关 三、Kubernetes&#x…

前端搭建低代码平台,微前端如何选型?

目录 背景 一、微前端是什么&#xff1f; 二、三大特性 三、现有微前端解决方案 1、iframe 2、Web Components 3、ESM 4、EMP 5、Fronts 6、无界&#xff08;文档&#xff09; 7、qiankun 四、我们选择的方案 引入qiankun并使用&#xff08;src外层作为主应用&#xff09; 主应…

Windows VSCode .NET CORE WebAPI Debug配置

1.安装C#插件 全名C# for Visual Studio Code&#xff0c;选择微软的 2. 安装C# Dev Kit插件 全名C# Dev Kit for Visual Studio Code&#xff0c;同样是选择微软的 3.安装Debugger for Unity 4.配置launch.json 文件 {"version": "0.2.0","config…