前后端即时通讯的应用场景:WebSocket、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 更简单、兼容性更好,但需根据实际需求(如是否需要双向通信)选择技术方案。 阅读详情

相关推荐

即时通讯Web端开发:短轮询、Comet、Websocket、SSE

所以,要做到用SSE在数据传输性能上和WebSocket完全一样,需要写一个自己的后端服务器,当然,那些在任何情况下都会用自己的服务器并使用Node.js的人,会觉得这有什么稀奇的。其实,服务器推很早就存在了,在经典的client/server模型中有广泛使用,只是浏览器太懒了,并没有对这种技术提供很好的支持。传统的web应用要想与服务器交互,必须提交一个表单(form),服务器接收并处理传来的表单,然后返回全新的页面,因为前后两个页面的数据大部分都是相同的,这个过程传输了很多冗余的数据、浪费了带宽。

蔚可云的博客 675

SSE详解

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

技术人集结地 6904

Web端即时通讯 Comet Websocket SSE

主流的Web端即时通讯方案大致有4种:传统Ajax短轮询、Comet技术、WebSocket技术、SSE(Server-sent Events)。一、Comet含义:是一种服务器推送数据的技术(更高级的ajax技术)实现方式:长轮询和流;介绍:        1、短轮询:                     请求之后服务器立即响应        2、长轮询                   ...

王甲评的博客 1049

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

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

cnzzs的博客 3815

网页端IM即时通讯技术入门之短轮询、长轮询、SSE、WebSocket

对Web端即时通讯技术熟悉的开发者来说,我们回顾网页端IM的底层通信技术,从短轮询、长轮询,到后来的SSE以及WebSocket,使用门槛越来越低(早期的长轮询Comet这类技术实际属于hack手段,使用门槛并不低),技术手段越来越先进,网页端即时通讯技术的体验也因此越来越好。之前的这些所谓的网页端即时通讯“老技术”相对于当红的WebSocket,并非毫无用武之地。就拿IM里的扫码登录功能来说,用短轮询技术就非常合适,完全没必要大炮打蚊子上WebSocket。 所以,很多时候没必要盲目追求新技术,相对应用场

蔚可云的博客 704

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

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

Criss@陈磊 1269

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

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

java_121388的博客 948

GD32H7系列SRAM优化配置实战指南

本文详细解析了GD32H7系列MCU的SRAM架构,包括ITCM、DTCM、AXI SRAM等关键内存区域的特点与性能差异。通过实战指南,指导开发者如何通过配置寄存器和链接脚本,优化内存布局以提升系统性能,并重点探讨了DMA操作与CPU缓存一致性的解决方案,帮助充分发挥GD32H7的高性能潜力。

weixin_29169899的博客 519

前端实现即时通讯:短轮询、长轮询、SSE 与 WebSocket 全面解析

本文介绍了前端实现即时通讯的四种主流技术: 1️⃣ 短轮询:周期性请求服务器,实现简单但资源消耗大 2️⃣ 长轮询:服务器保持连接直到有数据,接近实时但维护复杂 3️⃣ SSE:服务器单向推送事件流,适合通知类场景 4️⃣ WebSocket:全双工通信,适用于高实时需求场景 对比分析了各项技术的原理、代码示例、优缺点及适用场景,建议根据具体业务需求选择:WebSocket适合双向通信,SSE适合单向推送,轮询适合简单实现。

小彭的博客 2353

智能座舱通信技术解析:从CAN总线到车载以太网与V2X

在汽车电子与智能网联快速融合的背景下,座舱智能化已不再是简单的屏幕堆砌,而是依赖底层通信技术构建的复杂系统。CAN总线因高可靠性与确定性传输,持续承担车身控制与安全信号的传递;车载以太网则凭借高带宽优势,成为多屏高清视频与OTA升级的核心通道;V2X车路协同技术进一步将座舱与外界的实时信息互联。理解这些技术的分工协作,是掌握智能座舱架构、开展座舱测试与故障排查的关键。本文从实际测试经验出发,梳理不同总线在座舱内部及外部的应用逻辑,结合低成本的实验台架搭建指南,展示从信号采集、网关转发到多媒体流传输的完整链路

weixin_29284657的博客 344

RT-DETR-R18 的轻量化 Trick:剪枝与量化在模型中的应用

RT-DETR-R18轻量化技术通过结构化剪枝、混合精度量化和知识蒸馏的组合优化,实现了显著模型压缩效果。摘要如下: RT-DETR-R18模型通过创新轻量化技术组合,在保持46.2% mAP精度的前提下,将模型大小压缩至2.1MB(压缩率78%),计算量降至3.2 GFLOPs(减少78.2%),实现移动端28ms实时推理(加速37.8%)。核心技术包括:1)渐进式结构化剪枝系统,通过L1范数重要性评估和动态剪枝调度;2)混合精度量化策略,对关键层保留FP16精度;3)教师-学生知识蒸馏框架保持模型表达能

走向CTO的路上... 1195

搞懂现代 Web 端即时通讯技术一文就够:WebSocket、socket.io、SSE

​本文将专门介绍 WebSocket、socket.io、SSE这几种现代的 Web 端即时通讯技术,从适用场景到技术原理,通俗又不失深度的文字,特别适合对 Web 端即时通讯技术有一定了解,且想深入学习 WebSocket 等现代 Web 端“实时”通信技术,却又不想花时间去深读枯燥的 IETF 技术手册的读者。

chengbo_eva的博客 1208

【ARM CoreLink 系列 7 -- TZC-400控制器简介】

为了确保内存能够正确识别总线的信号控制位,新增一个TrustZone地址空间控制器(TrustZone Address Space Controller,TZASC)组件来实现对内存地址的安全扩展,将内存区域划分为安全内存区域和非安全内存区域,安全世界可以访问安全内存和非安全内存,而普通世界只能访问非安全内存,如下图所示:图 1-1内存区域的划分是在系统启动时通过配置 TZASC 组件(TZC-400/TZC-380)来实现的。TZC-400由和使能情况;安全访问权限;Base地址;

CodingCos的博客 1634

Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

本文介绍了四种主流的Web端即时通讯技术:Ajax短轮询、Comet、WebSocket和SSE。Ajax通过异步请求实现数据交互,但无法满足实时性要求;Comet采用长连接"服务器推"技术,包括长轮询和流方式两种实现;WebSocket作为HTML5标准,提供真正全双工通信;SSE则专注于服务端向客户端的单向推送。文章分析了各项技术的原理、优缺点及适用场景,指出WebSocket和SSE代表未来方向,但当前浏览器兼容性仍是挑战。特别比较了WebSocket和SSE在实现复杂度、协议类型

没有简介 1265

RT-DETR改进策略【模型轻量化】| 替换骨干网络为 2024轻量化网络MoblieNetV4:移动生态系统的通用模型

本文记录的是基于MobileNet V4的RT-DETR目标检测轻量化改进方法研究。通过整合UIBMobile MQA以及优化的NAS策略能够在在不降低性能指标的前提下,降低计算成本。本文配置了原论文中和五种模型,以满足不同的需求。

Limiiiing的博客 1924

黑猫带你学eMMC协议第26篇:eMMC的硬件复位操作(H/W reset)

本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 文章为个人辛苦整理,付费内容,禁止私自转载。 文章所在专栏:《黑猫带你学:eMMC协议详解》 1 概述 什么是硬件复位? 硬件复位就是使用一个特殊硬件信号(这个信号在RST_n这根实实在在的物理线路上传输)将emmc复位到pre-idle state,而不需要使用cmd0或者power cycle讲emmc复位到pre-idle state。 如何进行硬件复位? 1、设置RST_n_FUNCTION [162]为1,使emm.

黑猫奥利奥的博客 6319

SSE技术和WebSocket技术实现即时通讯

服务器发送事件SSE(Server-Sent Events)是一种基于HTTP的单向通信机制,用于实现服务器主动向客户端推送数据的技术,也被称为“事件流它基于HTTP协议,利用其长链接的特性,在客户端与服务器之间建立一条持久化连接,并通过这条连接实现服务器向客户端实时数据推送。WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议。它是 HTML5 中的一种新特性,能够实现 Web 应用程序和服务器之间的实时通信,比如在线聊天、游戏、数据可视化等。

weixin_43599321的博客 6249

SPME/IP PPT详解

什么是中间件?它是操作系统与应用程序之间的一块代码,它对于应用程序提供了一些标准接口,屏蔽了应用程序与底层的一些交互,上层应用程序只要和中间件进行交互就可以了,这样就可以达到一个解耦的目的。SOMEIP其实是一个中间件,它是操作系统与应用程序之间的一段代码,它是可以运行在TCP/IP之上的,可以在很多平台上使用,可以适配较多的操作系统,可以提供很多接口。经过序列化之后,在网络上传输的是一些101010这样的二进制流。SOME/IP可以承接应用层的一些数据,进行打包放到传输层。

usstmiracle的博客 620

JAVA应用使用SSE长连接进行即时通讯

JAVA应用使用SSE长连接实现流式输出的经验总结

weixin_38554080的博客 1万+

读懂 SAP S/4HANA 里的 SAP Fiori 架构:前端服务器、搜索链路、传统应用接入与内容组织全景解析

摘要:SAP Fiori架构并非简单的系统连接图,而是明确区分界面层与业务数据层的三层分工体系:用户交互层(浏览器与Fiori launchpad)、前端技术层(SAPUI5运行环境)和业务数据层(SAP S/4HANA后端)。这种分离实现了生命周期解耦,前端专注于统一体验治理,后端处理核心业务逻辑。值得注意的是,SAP Fiori front-end server本质仍是ABAP系统,负责UI技术组件运行。虽然SAP S/4HANA推荐嵌入式部署,但独立部署在多系统场景中仍有价值。典型Fiori应用通过O

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 180

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IM通信技术快速入门:短轮询、长轮询、SSE、WebSocket

IM通信技术是现代应用中至关重要的一部分,开发者可以根据实际需求选择不同的通信技术。本文介绍了短轮询、长轮询、Server-Sent Events(SSE)、WebSocket 这四种通信技术的原理和实现方式,并通过简单的代码示例演示了它们的应用。在选择合适的通信技术时,需要根据实际场景的需求、安全性、性能等因素进行综合考虑。随着技术的不断发展,IM通信技术也会迎来更多的创新和改进,为开发者提供更多选择。😊🙏Java面试技巧Java面试八股文 - 掌握面试必备知识(目录篇)Java学习路线。

学IT,找陈寒 6185

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

轮询、长轮询(comet)、长连接(SSE)、WebSocket

这无形中造成了资源的浪费。尤其是在客户端,距离来说,如果有数量级相对比较大的人同时位于基于短轮询的应用中,那么每一个用户的客户端都会疯狂的向服务器端发送http请求,而且不会间断。这种方式实现的即时通信,本质上还是浏览器发送请求,服务器接受请求的一个过程,通过让客户端不断的进行请求,使得客户端能够模拟实时地收到服务器端的数据的变化。长轮询本质上也是轮询,只不过对普通的轮询做了优化处理,服务端在没有数据的时候并不是马上返回数据,会hold住请求,等待服务端有数据,或者一直没有数据超时处理,然后一直循环下去。

Eden 的博客 1889

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

轮询、长轮询comet、长连接SSE、websocket

websocket

weixin_44999716的博客 1897

SSE和WebSocket

SSE和WebSocket SSE SSE:server send event。服务端发送事件,指服务端主动给客户端推送消息(单向) 服务端代码: package com.example.demo.sse; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.CrossOrigin

anyview93的博客 1507

Web端即时通讯技术(SEE,webSocket)

服务器端可以即时地将数据的更新或变化反应到客户端,例如消息即时推送等功能都是通过这种技术实现的。但是在Web中,由于浏览器的限制,实现即时通讯需要借助一些方法。这种限制出现的主要原因是,一般的Web通信都是浏览器先发送请求到服务器,服务器再进行响应完成数据的现实更新。实现即时通讯主要有四种方式,它们分别是轮询长轮询(comet)长连接(SSE)WebSocket。它们大体可以分为两类,一种是在HTTP基础上实现的,包括短轮询、comet和SSE;另一种不是在HTTP基础上实现是,即WebSocket。

日常bug 5236
上一篇: 一款开源的聊天系统!
下一篇: 神级抢票工具!!!
架构文摘JGWZ
博客等级 码龄5年 8808粉丝 345原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值