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

用Go实现 SSE 实时推送消息(消息通知)——思悟项目技术4

目录

简介

工作原理

例子

使用场景


简介

SSE(Server - Sent Events)是一种允许服务器向客户端实时推送更新的 Web 技术。是一种基于 HTTP 协议的单向通信机制,服务器可以在客户端建立连接后,持续不断地向客户端发送事件流。客户端只需发起一次请求,服务器就能随时向客户端推送新的数据,无需客户端反复请求。

工作原理

  1. 客户端发起请求:客户端通过创建一个 EventSource 对象(在浏览器环境中)向服务器发起一个 HTTP 请求,请求的响应头中 Content - Type 为 text/event - stream。
  2. 服务器建立连接:服务器接收到请求后,与客户端建立长连接,保持连接处于打开状态。
  3. 服务器推送数据:服务器可以在有新数据时,将数据以特定的格式(事件流格式)发送给客户端。事件流由多个事件组成,每个事件包含事件类型、数据等信息。
  4. 客户端接收数据:客户端的 EventSource 对象会持续监听服务器发送的事件流,当接收到新事件时,会触发相应的事件处理函数。

    例子

    后端(Go + Gin):

    POST /send 端点是用于接收前端发送的消息并广播到所有 SSE 客户端,它的作用是触发消息的推送。

    而 for msg := range client 这部分代码是具体执行消息推送的逻辑,它确保 SSE 连接的客户端能够实时收到消息。

    package mainimport ("fmt""net/http""sync""time""github.com/gin-gonic/gin"
    )type Client chan stringvar (clients   = make(map[Client]bool) // 记录所有 SSE 连接clientsMu sync.Mutex              // 保护 clients 并发访问
    )func main() {r := gin.Default()// SSE 端点:用于客户端接收推送r.GET("/stream", func(c *gin.Context) {client := make(Client, 10) // 创建一个带缓冲的通道clientsMu.Lock()clients[client] = true // 添加新客户端clientsMu.Unlock()// 设置 SSE 头部c.Header("Content-Type", "text/event-stream")c.Header("Cache-Control", "no-cache")c.Header("Connection", "keep-alive")// 监听消息通道// 监听 SSE(Server-Sent Events) 连接的消息通道,并将新消息推送到客户端。它实现了 服务器端的推送机制。for msg := range client {fmt.Fprintf(c.Writer, "data: %s\n\n", msg)c.Writer.Flush()}})// 发送消息端点:接收前端消息,并推送给所有客户端r.POST("/send", func(c *gin.Context) {var json struct {Message string `json:"message"`}if err := c.ShouldBindJSON(&json); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}// 发送消息到所有 SSE 客户端broadcast(json.Message)c.JSON(http.StatusOK, gin.H{"status": "sent"})})r.GET("/", func(c *gin.Context) {c.Header("Content-Type", "text/html")c.String(http.StatusOK, htmlContent)})r.Run(":8080")
    }// 发送消息给所有已连接的 SSE 客户端
    func broadcast(message string) {clientsMu.Lock()defer clientsMu.Unlock()for client := range clients {select {case client <- fmt.Sprintf("%s - %s", message, time.Now().Format("15:04:05")):default:close(client)           // 关闭不可用的客户端delete(clients, client) // 从列表中移除}}
    }const htmlContent = `<!DOCTYPE html>
    <html lang="zh">
    <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>SSE 实时消息</title>
    </head>
    <body><h2>Server-Sent Events (SSE) 消息推送</h2><input type="text" id="messageInput" placeholder="输入消息"><button onclick="sendMessage()">发送消息</button><h3>收到的消息:</h3><div id="messages"></div><script>// 监听 SSE 事件const eventSource = new EventSource("/stream");eventSource.onmessage = function(event) {const div = document.createElement("div");div.textContent = "收到:" + event.data;document.getElementById("messages").appendChild(div);};// 发送消息到后端function sendMessage() {const message = document.getElementById("messageInput").value;if (!message) return;fetch("/send", {method: "POST",headers: { "Content-Type": "application/json" },body: JSON.stringify({ message: message })}).then(response => response.json()).then(data => console.log("消息已发送:", data));}</script>
    </body>
    </html>`

    结果:

    使用场景

    • 实时新闻更新:新闻网站可以使用 SSE 实时向用户推送最新的新闻消息。
    • 股票行情推送:金融类应用可以利用 SSE 实时更新股票价格、交易信息等。
    • 在线聊天系统的消息通知:当有新消息时,服务器可以及时将消息推送给客户端。

    相关文章:

    用Go实现 SSE 实时推送消息(消息通知)——思悟项目技术4

    目录 简介 工作原理 例子 使用场景 简介 SSE&#xff08;Server - Sent Events&#xff09;是一种允许服务器向客户端实时推送更新的 Web 技术。是一种基于 HTTP 协议的单向通信机制&#xff0c;服务器可以在客户端建立连接后&#xff0c;持续不断地向客户端发送事件流。客…...

    0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型

    前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 0基础…...

    vue3:动态渲染后端返回的图片

    问&#xff1a; div classleft-png 这里我用css设置了他的背景图片&#xff0c;但是现在我希望改为后端返回的图片&#xff0c;怎么写&#xff1f; 后端返回数据&#xff1a; const centerdata {img:;xxxx,title,xxxx,num:xxxx}&#xff1f; 回答&#xff1a; 好的&#xff…...

    DeepSeek小白初识指南

    1.什么是DeepSeek&#xff1f; DeepSeek是一个基于大语言模型&#xff08;LLM&#xff09;的智能助手&#xff0c;能够处理自然语言理解、生成、对话等任务。它广泛应用于聊天机器人、内容生成、数据分析等领域。 2.DeepSeek和OpenAI等大模型差异&#xff1f; 虽然DeepSeek和Op…...

    图像锐化(QT)

    如果不使用OpenCV&#xff0c;我们可以直接使用Qt的QImage类对图像进行像素级操作来实现锐化。锐化算法的核心是通过卷积核&#xff08;如拉普拉斯核&#xff09;对图像进行处理&#xff0c;增强图像的边缘和细节。 以下是一个完整的Qt应用程序示例&#xff0c;展示如何使用Qt…...

    38.社区信息管理系统(基于springboothtml)

    目录 1.系统的受众说明 2.需求分析及相关技术 2.1设计目的 2.2社区信息管理系统的特点 2.3可行性分析 2.3.1技术可行性 2.3.2运行可行性 2.4系统设计 2.4.1系统功能分析 2.4.2管理员权限功能设计 2.4.3业主权限功能设计 2.5系统的技术介绍 2.5.1 Html 2.5.2 Aja…...

    游戏引擎学习第98天

    仓库:https://gitee.com/mrxiao_com/2d_game_2 开始进行一点回顾 今天的目标是继续实现正常贴图的操作&#xff0c;尽管目前我们还没有足够的光照信息来使其完全有用。昨日完成了正常贴图相关的基础工作&#xff0c;接下来将集中精力实现正常贴图的基本操作&#xff0c;并准备…...

    音频知识基础

    音频知识基础 声音属性声音度量人耳特性通道数音频数字化传输接口 声音属性 响度 响度是人耳对声音强弱的主观感受&#xff1b; 主要和声波的振幅相关&#xff0c;同时也和频率有一定关系&#xff1b; 音调 音调是人耳对声音高低的主观感受&#xff1b; 主要与频率相关&#…...

    【AI赋能】蓝耘智算平台实战指南:3步构建企业级DeepSeek智能助手

    蓝耘智算平台实战指南&#xff1a;3步构建企业级DeepSeek智能助手 引言&#xff1a;AI大模型时代的算力革命 在2025年全球AI技术峰会上&#xff0c;DeepSeek-R1凭借其开源架构与实时推理能力&#xff0c;成为首个通过图灵测试的中文大模型。该模型在语言理解、跨模态交互等维…...

    LabVIEW无人机飞行状态监测系统

    近年来&#xff0c;无人机在农业植保、电力巡检、应急救灾等多个领域得到了广泛应用。然而&#xff0c;传统的目视操控方式仍然存在以下三大问题&#xff1a; 飞行姿态的感知主要依赖操作者的经验&#xff1b; 飞行中突发的姿态异常难以及时发现&#xff1b; 飞行数据缺乏系统…...

    DeepSeek模型架构及优化内容

    DeepSeek v1版本 模型结构 DeepSeek LLM基本上遵循LLaMA的设计&#xff1a; 采⽤Pre-Norm结构&#xff0c;并使⽤RMSNorm函数. 利⽤SwiGLU作为Feed-Forward Network&#xff08;FFN&#xff09;的激活函数&#xff0c;中间层维度为8/3. 去除绝对位置编码&#xff0c;采⽤了…...

    html语义化

    常见语义化标签有&#xff1a; &#xff08;1&#xff09;页面结构标签&#xff1a;<header>、<nav>、<main>、<article>、<section>、<aside>、<footer> &#xff08;2&#xff09;文本语义标签&#xff1a;<h1>-<h6>…...

    python学习第十四天之机器学习名词介绍

    名词介绍 1. 常用术语解释2.常见机器学习任务3. 机器学习常见算法1. 监督学习&#xff08;Supervised Learning&#xff09;2. 非监督学习&#xff08;Unsupervised Learning&#xff09;3.深度学习4.**对比总结** 1. 常用术语解释 拟合&#xff08;Fit&#xff09;&#xff1…...

    天津三石峰科技——汽车生产厂的设备振动检测项目案例

    汽车产线有很多传动设备需要长期在线运行&#xff0c;会出现老化、疲劳、磨损等 问题&#xff0c;为了避免意外停机造成损失&#xff0c;需要加装一些健康监测设备&#xff0c;监测设备运 行状态。天津三石峰科技采用 12 通道振动信号采集卡&#xff08;下图 1&#xff09;对…...

    汽车与AI深度融合:CES Asia 2025前瞻

    在科技飞速发展的当下&#xff0c;汽车与AI的融合正成为行业变革的关键驱动力。近日&#xff0c;吉利、极氪、岚图、智己等多家车企纷纷官宣与DeepSeek模型深度融合&#xff0c;其中岚图知音更是将成为首个搭载该模型的量产车型&#xff0c;这无疑是汽车智能化进程中的重要里程…...

    前端实现 GIF 图片循环播放

    前言 使用 img 加载 GIF 图片&#xff0c;内容只会播放一次&#xff0c;之后就会自动暂停&#xff1b; 通过定时器在一段时间后重新加载图片的方式&#xff0c;会导致浏览器内存不断增大&#xff0c;并且可能会有闪烁、卡顿的问题&#xff1b; ImageDecoder WebCodecs API 的…...

    React - 事件绑定this

    在 React 中&#xff0c;this 的绑定是一个常见问题&#xff0c;尤其在类组件中使用事件处理函数时。JavaScript 中的 bind 函数用于设置函数调用时 this 的值。 bind 函数的作用 bind() 方法创建一个新的函数&#xff0c;当被调用时&#xff0c;其 this 关键字被设置为提供的…...

    STM32系统架构介绍

    STM32系统架构 1. CM3/4系统架构2. CM3/4系统架构-----存储器组织结构2.1 寄存器地址映射&#xff08;特殊的存储器&#xff09;2.2 寄存器地址计算2.3 寄存器的封装 3. CM3/4系统架构-----时钟系统 STM32 和 ARM 以及 ARM7是什么关系? ARM 是一个做芯片标准的公司&#xff0c…...

    Macbook Pro快速搭建Easysearch学习环境

    在学习过程中&#xff0c;我们有时身边没有可用的服务器&#xff0c;这时就需要借助自己的 Mac 来安装和学习 Easysearch。然而&#xff0c;Easysearch 官网并未提供 Mac 版本的安装教程&#xff0c;下面我将详细整理我在 Mac 上安装和使用 Easysearch 的折腾经历。 Easysearc…...

    老游戏回顾:SWRacer

    竞速类游戏里&#xff0c;我很怀念它。 虽然已经25年过去了。 相比之下&#xff0c;别的游戏真的没法形容。 ---- 是LucasArts制作的一款赛车竞速游戏&#xff1b; 玩家要扮演一名银河旅行者参加各种赛车比赛&#xff0c;赢得奖金&#xff0c;在经历了八个不同星球上的24场…...

    Firefox无法隐藏标题栏

    Openbox 窗管 Firefox 无法隐藏标题栏。 深度Linux安装火狐,Linux(deepin) 下隐藏 Firefox 标题栏-CSDN博客 需要在 desktop 的 exec 中增加环境变量&#xff1a; Execenv MOZ_GTK_TITLEBAR_DECORATIONclient firefox...

    vue基础(五)

    Vue 实例在创建、挂载、更新、销毁的过程中会触发一系列的生命周期钩子&#xff08;Lifecycle Hooks&#xff09;&#xff0c;让开发者可以在不同阶段执行逻辑。 1. Vue 2 生命周期完整流程 生命周期的四个主要阶段 创建阶段&#xff08;Creation&#xff09;挂载阶段&#…...

    MySQL的深度分页如何优化?

    大家好&#xff0c;我是锋哥。今天分享关于【MySQL的深度分页如何优化&#xff1f;】面试题。希望对大家有帮助&#xff1b; MySQL的深度分页如何优化&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL的深度分页&#xff08;即跳过大量数据后进行分…...

    深度学习每周学习总结R6(RNN实现阿尔茨海默病诊断)

    &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客R8中的内容&#xff0c;为了便于自己整理总结起名为R6&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. 数据集介绍2. 数据预处理3. 模型构建4. 初始化模型及优化器5. 训练函…...

    Node.js 多模态图像描述服务 调用siliconflow:现代 JavaScript 实践

    Node.js 多模态图像描述服务&#xff1a;现代 JavaScript 实践 项目背景 本项目使用 Node.js 和 TypeScript 实现一个高性能的图像描述微服务&#xff0c;展示 JavaScript 在多模态 AI 应用中的强大能力。 技术栈 Node.jsTypeScriptExpress.jsOpenAI APIdotenvRxJS (可选&a…...

    机器学习数学基础:21.特征值与特征向量

    一、引言 在现代科学与工程的众多领域中&#xff0c;线性代数扮演着举足轻重的角色。其中&#xff0c;特征值、特征向量以及相似对角化的概念和方法&#xff0c;不仅是线性代数理论体系的核心部分&#xff0c;更是解决实际问题的有力工具。无论是在物理学中描述系统的振动模式…...

    【目标检测json2txt】label从COCO格式json文件转YOLO格式txt文件

    目录 🍀🍀1.COCO格式json文件 🌷🌷2.YOLO格式txt文件 💖💖3.xml2json代码(python) 🐸🐸4.输入输出展示 🙋🙋4.1输入json 🍂🍂4.2输出txt 整理不易,欢迎一键三连!!! 送你们一条美丽的--分割线-- 🍀🍀1.COCO格式json文件 COCO数…...

    强化学习之 PPO 算法:原理、实现与案例深度剖析

    目录 一、引言二、PPO 算法原理2.1 策略梯度2.2 PPO 核心思想 三、PPO 算法公式推导3.1 重要性采样3.2 优势函数估计 四、PPO 算法代码实现&#xff08;以 Python 和 PyTorch 为例&#xff09;五、PPO 算法案例应用5.1 机器人控制5.2 自动驾驶 六、总结 一、引言 强化学习作为…...

    vue-点击生成动态值,动态渲染回显输入框

    1.前言 动态点击生成数值&#xff0c;回显输入框&#xff0c;并绑定。 2.实现 <template><div style"display:flex;align-items: center;flex-direction:row"><a-input:key"inputKey"v-model"uploadData[peo.field]"placehold…...

    高性能 :OpenAI Triton Open-source GPU programming Language LINUX 环境配置

    目录 配置triton环境cudabuild-essential带有pip的python环境直接安装pipanaconda 安装 triton 环境pip install tritonpip install torch 运行test示例vector-add.pylaunch.json 配置triton环境 cuda wget http://developer.download.nvidia.com/compute/cuda/11.0.2/local_…...