WebSocket or SSE?即时通讯的应用策略

HTML5 服务器发送事件(Server-Sent Events, SSE):实时数据传输的新篇章 Server-Sent Events(SSE)是一种基于HTTP协议的长期连接技术,允许服务器端实时地将数据推送到客户端浏览器。与Ajax轮询相比,SSE减少了不必要的请求,提高了资源利用率和数据传输的实时性。每个SSE连接都支持文本数据流,服务器可以多次发送数据到客户端,而不需要客户端发起新的请求。Server-Sent Events为开发者提供了一种简便的实时数据传输方案,特别适合那些不需要双向通信的场景。随着现代Web应用对实时性要求的不断提升,SSE无疑成为了前端工程师工具箱中不可或缺的一员。 阅读详情

最近在研究H5推送,发现除了我们常用的WebSocket以外,其实还有一种协议也能实现H5推送,那就是SSE协议。

而且,当前主流的大模型平台,比如ChatGPT、通义千问、文心一言,对话时采用的就是SSE。

什么是SSE协议?

Server-Sent Events (SSE) 是一种基于HTTP协议的服务器到客户端的单向数据通信技术,允许服务器向浏览器实时推送更新,而不需要客户端通过轮询等方式反复请求数据。

SSE协议主要用于实现实时更新的Web应用,比如股票报价、新闻更新、社交网络的新消息通知等场景。

那么,同为H5推送的主流协议,SSE和WebSocket有什么区别?

SSE VS WebSocket

我们从以下几个方面来进行对比:

维度SSEWebSocket
协议原理基于HTTP/1.1,通过长连接实现服务器单向推送通过独立的WebSocket协议建立双向实时通信连接
易用性简单,前端使用EventSource对象即可相对复杂,需要更多的开发和配置工作
兼容性现代浏览器广泛支持同样广泛支持,但需注意旧版浏览器兼容性
通信方向单向(服务器→客户端)双向(服务器↔客户端)
事件驱动支持,事件数据可通过事件类型区分需自行在应用层实现
数据格式主要支持文本数据,可携带自定义元数据支持文本和二进制数据,格式灵活
连接管理浏览器自动处理连接恢复,可能面临连接断开问题开发者可全面控制连接状态和错误处理
资源效率长期无数据传输时可能出现连接中断,需重新连接建立连接后,资源消耗相对更低,无需频繁重建连接
缓存策略利用HTTP缓存策略需要开发者自行实现缓存策略

综合以上对比结果,若是H5动作较少的单向刷新场景,例如股价刷新、新闻动态等,建议选择SSE;若是在线协作、实时游戏等H5跟服务端交互较多的场景,建议使用WebSocket。

SSE实例

接下来,我们就用SpringBoot写一个SSE实例。

首先是服务端引入spring-boot-starter-web包,它自带支持SSE协议。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

接下来是创建SSE的Controller接口:

    package com.test.web;

    import lombok.extern.slf4j.Slf4j;
    import org.springframework.http.MediaType;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;

    /**
     * SSE测试类
     */
    @Slf4j
    @RestController
    @RequestMapping("/sse")
    public class SseController {

        private static final Map<String, SseEmitter> map = new HashMap<>();

        @GetMapping(value = "/createSseEmitter", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
        public SseEmitter createSseEmitter(String clientId) {
            SseEmitter emitter = new SseEmitter(0L);
            emitter.onCompletion(() -> map.remove(emitter));
            emitter.onTimeout(() -> map.remove(emitter));
            map.put(clientId, emitter);
            return emitter;
        }

        @Scheduled(fixedDelay = 1000) // 每隔5秒推送一次模拟数据
        public void pushDataToAllClients() {
            for (Map.Entry<String, SseEmitter> entry : map.entrySet()) {
                    try {
                        String data = "This is some updated data from server at " + System.currentTimeMillis();
                        entry.getValue().send(SseEmitter.event().name("message").data(data));
                    } catch (IOException e) {
                            log.error("Error sending data to client", e);
                    }
                }
        }
    }

然后是前端测试代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>实时股票价格监控</title>
    </head>
    <body>
    <h1>实时股票价格</h1>
    <div id="stock-price"></div>

    <script>
      const source = new EventSource('/sse/createSseEmitter?clientId=123456');
      source.onopen = function() {
                console.log('Connection to the server was opened.');
      };

      source.onmessage = function (event) {
         // document.getElementById('stock-price').innerHTML = event.data;
         const logItem = document.createElement('p');
         logItem.textContent = event.data;
         document.getElementById('stock-price').appendChild(logItem);
      };

      source.onerror = function(error) {
         console.error('Error occurred:', error);
                // 处理重连或其他错误逻辑
      };
    </script>
    </body>
    </html>

由于SSE不支持跨域,此处再加个NGINX代理:

    location /test {
        root /home;
    }
    location /sse {
        proxy_pass  http://10.10.2.100:8080;
        proxy_http_version 1.1; # 使用HTTP/1.1以支持长连接
        proxy_set_header Upgrade $http_upgrade; # 用于Websocket和SSE的Upgrade头
        proxy_set_header Connection "upgrade"; # 设置Connection头为upgrade,维持长连接
        proxy_set_header Host $host; # 传递原始Host头给后端
        proxy_cache_bypass $http_upgrade; # 忽略缓存,对于实时连接很重要
        proxy_read_timeout 60m; # 增加读取超时时间以适应长时间的SSE连接
    }

运行结果如下:

Server-Sent Events(SSE)协议详解 SSE 是实现服务器到客户端实时通信的轻量级方案,适合单向数据推送场景。相比 WebSocket,SSE 更简单、兼容性更好,但需根据实际需求(如是否需要双向通信)选择技术方案。 阅读详情

相关推荐

即时通讯开发中WebSocket和SSE技术如何实现Web端消息推送

无需发送 GET 消息并等待服务器响应,客户端只需监听该套接字,接收服务器更新,并使用收到的数据来发起或支持各种交互。与 WebSocket 相比,SSE 的一个优势是它是基于 HTTP 而运行的,不需要其他组件。SSE 是一个更简单且更快的解决方案,但它是不可扩展的。对于只需要能向客户端传输异步服务器消息的 Web 应用程序,服务器发送的事件是一个优雅且简单的解决方案。HTTP 服务器推送也称为 HTTP 流,是一种客户端-服务器通信模式,它将信息从 HTTP 服务器异步发送到客户端,而无需客户端请求。.

蔚可云的博客 1266

SSE详解

SSE(Server-Sent Events)是一种基于HTTP协议的服务器推送技术,适用于单向实时数据传输场景。其核心特点包括:单向通信、轻量级实现、自动重连机制和事件类型支持。SSE通过持久连接推送数据,客户端使用EventSource监听消息。相比WebSocket,SSE更简单但仅支持文本传输,适合实时通知、数据更新等场景。Spring Boot可通过SseEmitter快速实现SSE服务,前端通过EventSource接收推送。主要优势是兼容性好、实现简单,但局限性在于不支持双向通信和二进制数据。

技术人集结地 6904

微信小程序中基于 SSE 实现轻量级实时通讯 —— 原理、实践与对比分析

本文深入探讨了在微信小程序开发中,如何通过 wx.request + enableChunked + onChunkReceived 方式,模拟 Server-Sent Events(SSE)实现轻量级实时通讯机制。文章系统分析了微信小程序常见的通讯方式,详解 SSE 的原理、优势及完整封装实践,结合实际代码模块,演示小程序端如何高效接收服务器推送的数据。并通过对比 WebSocket、TCP、UDP 等方案,总结适用场景与最佳实践,帮助开发者在不同业务需求下选择最优通讯策略,兼顾性能与稳定性。

qq_40791475的博客 3512

Server-Sent Events(SSE)协议原理与实践

Server-Sent Events(SSE)协议原理与实践 这些年,语言类大模型相关的应用成为了非常热门的提效工具。各行各业都可以通过定制化的AI工具来提高工作效率。在这类应用的客户端中,由于大模型的运算效率和输出格式的原因,你会发现几乎所有的实时交流都是流式输出的,一个体验良好的客户端会实时接收数据流,进行MarkDo...

cnzzs的博客 3815

前端即时通讯技术全解析:从轮询到WebSocket的实战方案

即时通讯是现代Web应用实现实时数据交互的核心技术,其原理在于建立客户端与服务器之间的持久连接,以实现数据的低延迟推送与接收。这项技术的价值在于能够显著提升用户体验,使应用具备实时响应能力,广泛应用于在线聊天、协同编辑、实时通知和在线游戏等场景。在实现层面,开发者需要根据具体需求在短轮询、长轮询、Server-Sent Events和WebSocket等方案中进行选型,其中WebSocket凭借其全双工通信能力成为高实时性场景的首选。本文聚焦于前端即时通讯的实现,通过对比分析不同方案的技术细节与工程实践,为

weixin_33947521的博客 633

前端即时通讯实战:从WebSocket协议到工程化架构设计

即时通讯(IM)是实现实时数据交互的核心技术,其本质是基于长连接的双向通信机制。从技术原理上看,前端实现IM主要依赖WebSocket、Server-Sent Events(SSE)和长轮询等协议,其中WebSocket凭借全双工、低延迟的特性成为现代Web应用的首选。这项技术的工程价值在于将网络协议知识转化为高可用的线上服务,需要系统性地处理连接管理、消息可靠性和状态同步等复杂问题。在实际应用场景中,即时通讯已从在线聊天扩展到协同编辑、实时通知、直播互动等多个领域,对前端开发者的工程化能力提出了更高要求。

congsikuai0611的博客 503

WebSocket or SSE?即时通讯的应用策略【送源码】

Server-Sent Events (SSE) 是一种基于HTTP协议的服务器到客户端的单向数据通信技术,允许服务器向浏览器实时推送更新,而不需要客户端通过轮询等方式反复请求数据。SSE协议主要用于实现实时更新的Web应用,比如股票报价、新闻更新、社交网络的新消息通知等场景。那么,同为H5推送的主流协议,SSE和WebSocket有什么区别?

java_121388的博客 1562

ChatGPT使用的SSE协议接口怎么做测试

SSE最近突然的被很多人关注还有一个主要原因就是ChatGPT等大模型的聊天类系统就采用了SSE协议。在使用ChatGPT的时候,输入Prompt后的反馈是逐渐的显示在聊天区域的,这部分的实现就是主要基于EventStream的事件流,类似打字机一样输出的,这就是SSE的实现,其实类似一下股票行情推送、期货行情推送都可以使用SSE实现。

Criss@陈磊 1269

【nodejs】不用WebSocket模拟即时通讯的几种方式(Comet与SSE)

背景 最近学了websocket,感觉很有趣,特别是不用websocket也能模拟出即时通讯效果的骚操作非常牛b。 Comet 这个Comet翻译成中文叫服务器推技术。 传统模式是客户端发请求,服务端返回就结束了,但这明显不能满足即时报价,即时通讯之类需求。 而comet技术解决这个痛点一般采用2种方式: 1、在浏览器端安装插件,基于套接口传送信息,或是使用 RMI、CORBA 进行远程调用...

不忘初心,坚定道路! 1291

BurpSuite实战:5分钟搞定Pikachu靶场表单爆破(附最新字典配置技巧)

本文通过Pikachu靶场实战,详细演示了如何使用BurpSuite的Intruder模块对Web登录表单进行暴力破解。从代理配置、请求捕获、集束炸弹模式设置,到载荷配置与结果分析,提供了完整的操作流程。文中还分享了2024年有效的字典获取与优化技巧,帮助安全测试人员快速定位弱口令漏洞。

weixin_29327977的博客 601

3分钟搞定!QQ音乐歌单导出Excel保姆级教程(含歌单ID获取技巧)

本文提供了一份详细的QQ音乐歌单导出Excel保姆级教程,帮助用户轻松备份和管理个人音乐收藏。教程核心在于获取歌单ID,并利用浏览器开发者工具执行脚本提取数据,最后通过Excel导入功能快速生成结构化表格。整个过程无需编程基础,3分钟即可搞定,是个人数据管理的实用技巧。

weixin_29008691的博客 1412

前端即时通讯实战:从WebSocket、SSE到生产级优化

即时通讯(IM)是实现网络应用实时数据交换的核心技术,其原理在于突破传统HTTP请求-响应模型的单向限制,建立持久、低延迟的双向通信通道。这项技术的核心价值在于为在线聊天、协同编辑、实时通知与数据监控等场景提供了关键支撑。从技术实现层面看,前端领域主要依赖WebSocket协议实现全双工通信,或使用Server-Sent Events(SSE)进行服务器到客户端的单向推送。在实际工程中,构建健壮的即时通讯功能需深入处理心跳保活、断线重连、连接状态管理等生产级优化问题。本文聚焦于前端即时通讯的主流方案对比与实

weixin_30443747的博客 679

告别调参烦恼:用Simulink手把手实现自适应模糊PID温度控制(附模型下载)

本文详细介绍了如何使用Simulink实现自适应模糊PID温度控制,解决传统PID调参难题。通过模糊推理引擎动态调整PID参数,系统能自动适应不同工况,显著提升控制精度和响应速度。文章包含完整的建模步骤、参数优化技巧和工业应用扩展,并附赠可下载模型,帮助工程师快速掌握这一智能控制技术。

weixin_30872499的博客 154

前后端即时通讯的应用场景:WebSocket、SSE怎么选?【送源码】

Server-Sent Events (SSE) 是一种基于HTTP协议的服务器到客户端的单向数据通信技术,允许服务器向浏览器实时推送更新,而不需要客户端通过轮询等方式反复请求数据。SSE协议主要用于实现实时更新的Web应用,比如股票报价、新闻更新、社交网络的新消息通知等场景。那么,同为H5推送的主流协议,SSE和WebSocket有什么区别?

java_121388的博客 948

ESP32-IDF开发之旅 网络篇⑩ Web配网

本文介绍了基于ESP32S3的Web配网实现方案。作者通过移植开源项目,在ESP32S3上实现了WiFi配置功能,包括AP模式创建、HTTP服务器搭建、NVS存储读写等核心功能。文章详细解析了代码结构,包含WiFi初始化、事件处理、NVS存储管理和HTML页面服务等关键模块。实现方案采用AP+STA双模式,支持通过网页扫描WiFi并保存配置信息,适用于物联网设备的网络配置场景。代码中使用了FreeRTOS任务、ESP-IDF事件组等技术,并提供了完整的错误处理和日志记录功能。

单片机菜鸟哥的博客 352

【通信协议】GATT 与 BLE HID 工作原理详解

详细介绍BLE HID 跟GATT工作原理与两者的交互关系

以实战经验介绍行业知识 846

前后端即时通讯的应用场景:WebSocket、SSE怎么选?

Server-Sent Events (SSE) 是一种基于HTTP协议的服务器到客户端的单向数据通信技术,允许服务器向浏览器实时推送更新,而不需要客户端通过轮询等方式反复请求数据。SSE协议主要用于实现实时更新的Web应用,比如股票报价、新闻更新、社交网络的新消息通知等场景。那么,同为H5推送的主流协议,SSE和WebSocket有什么区别?

java_121388的博客 882

基于深度学习的番茄成熟度检测系统——YOLOv5、YOLOv8、YOLOv10及UI界面的实现

YOLO是一种快速且准确的目标检测模型,近年来,YOLOv5、YOLOv8和YOLOv10作为YOLO系列的重要版本,分别在速度、精度和效率上进行了优化。下面我们简要介绍这些模型。本文介绍了如何基于YOLOv5、YOLOv8和YOLOv10等深度学习模型,结合PyQt5设计一个番茄成熟度检测系统。通过训练模型、优化算法和设计用户友好的界面,我们能够构建一个高效且准确的番茄成熟度检测系统,广泛应用于农业自动化和智能化管理中。

YOLO 1002

短长轮询、SSE、WebSocket、TcpUdp、OSI

WebSocket是一种在单个TCP连接上进行全双工通讯(双向通信)的协议,能够实现客户端和服务器之间双向的实时持久通信,具备低延迟和高通信效率的特性,且在各种浏览器中都有良好的兼容性,可以广泛应用于Web开发领域。

の博客 772

5G 模组 FM650 USB模式查询及网络配置

完成以上配置后,5G模组可进行搜网,入网成功后,上位机获取 5G IP。

十年通信老兵的技术修炼之路——从3G到5G,从地面基站到卫星通信。 1326

用C#+Avalonia写跨平台串口工具:Windows/macOS/Linux通吃,还能解析Modbus+画实时曲线

不管是串口还是蓝牙,核心操作都是“打开连接、发数据、收数据、关连接”,先定义一个// 通信设备接口:统一串口/蓝牙的操作// 连接状态变化事件(UI层订阅)// 接收数据事件(收到数据后触发)// 通信配置(不同设备配置不同,用泛型)// 通信设备接口:统一串口/蓝牙的操作 public interface ICommDevice : IDisposable {// 连接状态变化事件(UI层订阅) event Action < bool > OnConnectionChanged;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 999

前端即时通讯全解析:WebSocket、SSE、长轮询方案对比与工程实践

即时通讯技术是现代Web应用实现实时数据交互的核心能力,其本质在于解决客户端与服务端之间的双向或单向低延迟通信需求。从技术原理上看,主要分为基于HTTP协议的轮询模拟方案(如短轮询、长轮询)、基于HTTP/2的Server-Sent Events(SSE)单向推送,以及基于TCP的WebSocket全双工协议。这些技术为在线聊天、实时通知、协同编辑、数据看板等场景提供了基础通信保障。在工程实践中,连接稳定性、心跳保活、断线重连机制是关键挑战,尤其在微前端架构或网络不稳定的移动环境下。本文聚焦WebSocke

weixin_33910460的博客 376

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

实时通信技术深度解析:SSE vs WebSocket vs 轮询(2025新版)

fill:#333;color:#333;color:#333;fill:none;实时通信方案轮询WebSocketSSE短轮询长轮询双向通信服务端单向推送。

Hu560231的博客 1546

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

SSE vs WebSocket 演示

在构建实时数据驱动的应用时,开发者常常面临一个核心抉择:是选择简单高效的单向推送,还是拥抱功能强大的双向交互?很多团队在项目初期为了追求"实时性",不加区分地全面引入 WebSocket,结果导致服务器资源被大量空闲连接占用,运维成本直线上升。反之,也有场景仅仅因为需要服务端主动推送一条新闻更新,就强行让客户端维持复杂的轮询机制,不仅浪费带宽,还增加了延迟。这种技术选型上的错位,往往源于对 SSE(Server-Sent Events)与 WebSocket 适用边界的模糊认知。

https://starzy1990.github.io/ 393

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

实时通信架构终极指南:WebSocket与SSE设计模式实战解析

在现代Web应用开发中,实时通信已成为提升用户体验的核心需求。无论是在线协作工具、实时数据监控系统还是即时通讯应用,都离不开高效可靠的实时数据传输技术。本文将深入探讨两种主流的实时通信设计模式——WebSocket和Server-Sent Events(SSE),帮助开发者理解它们的工作原理、适用场景及最佳实践,从而构建高性能的实时应用架构。 ## 实时通信架构核心技术对比 实时通信技术主要解

gitblog_00276的博客 1079

SSE 与 WebSocket 实战对比:3 大场景性能实测与 5 点选型建议

本文深入对比了SSE(Server-Sent Events)与WebSocket在实时通信中的性能表现,通过金融行情推送、即时通讯和物联网监控三大场景的实测数据,揭示了两者的优劣势。文章提供了5点选型建议,帮助开发者根据数据流向、协议兼容性、性能需求等因素做出合理选择,并分享了混合架构实践案例与前沿技术演进趋势。

weixin_34197488的博客 295
上一篇: 私活更好用:SpringBoot开源项目!!
下一篇: 学习神器:IDEA 源码阅读器!!
架构文摘JGWZ
博客等级 码龄5年 8808粉丝 345原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值