每日一博 - Server-Sent Events推送技术

news2024/12/25 0:45:00

文章目录

  • 概述
  • SSE VS WS
    • 一、实现方式
    • 二、应用场景
    • 三、性能方面
    • 四、小结结
  • Code
    • 在Spring Boot中使用SSE
    • 测试
    • 总结

在这里插入图片描述


概述

SSE(Server-Sent Events)是一种基于HTTP的服务器推送技术,它允许服务器实时地向客户端推送数据。相比于传统的轮询或长轮询技术,SSE具有更低的延迟、更高的效率和更低的资源消耗。

SSE最早由HTML5规范引入,目前已被广泛应用于各种Web应用中,如即时通讯、股票行情、新闻资讯等。SSE的工作原理非常简单,客户端通过与服务器建立一条长连接(即HTTP连接不会关闭),服务器可以在任意时刻向客户端推送数据,而客户端则通过监听这个连接上的事件来获取数据。

SSE的优点主要包括以下几个方面:

  1. 实时性好:SSE可以实现实时推送数据,相比于轮询或长轮询,能够更快地将数据传输到客户端。

  2. 节省资源:SSE只需要建立一条长连接,不需要频繁地建立和关闭连接,相比于传统的轮询或长轮询技术,能够更节省服务器和客户端的资源。

  3. 可靠性高:SSE使用HTTP协议进行通信,具有较好的兼容性和稳定性,同时也具备自动重连机制,能够在网络异常时自动重新连接。

  4. 简单易用:SSE的实现非常简单,只需要使用浏览器内置的EventSource对象即可实现数据的实时推送。

除了以上优点之外,SSE还具有以下几个特点:

  1. 单向通信:SSE只能由服务器向客户端推送数据,而客户端无法向服务器发送数据。

  2. 文本数据:SSE只支持文本数据的传输,无法传输二进制数据。

  3. 无状态:SSE是一种无状态协议,即每次推送数据时都需要重新发送完整的HTTP响应头。

在使用SSE时需要注意以下几点:

  1. 浏览器兼容性:虽然SSE已经成为HTML5规范的一部分,但并不是所有浏览器都支持SSE。在使用SSE时需要注意浏览器的兼容性问题。

  2. 服务器实现:SSE需要服务器端实现推送数据的逻辑,在实现时需要考虑到线程安全、并发性等问题。

  3. 数据格式:SSE只支持文本数据的传输,因此在传输数据时需要将数据转换成字符串格式。

总之,SSE是一种非常实用的服务器推送技术,在Web应用中具有广泛的应用前景。在使用SSE时需要注意浏览器兼容性、服务器实现和数据格式等问题,同时也需要注意安全性和稳定性等方面。


SSE VS WS

SSE(Server-Sent Events)和WebSocket都是实现服务器推送数据到客户端的技术,但它们在实现方式、应用场景和性能方面存在差异。

一、实现方式

SSE是基于HTTP协议的一种技术,它使用HTTP连接向客户端推送数据。客户端通过打开一个HTTP连接,然后服务器端可以通过该连接不断地向客户端发送数据。SSE使用的是单向通信,即只能由服务器向客户端发送数据,客户端不能向服务器发送数据。

WebSocket是一种全双工通信协议,它在建立连接后,客户端和服务器端可以互相发送数据。WebSocket使用的是TCP连接,与HTTP协议不同,它是一种独立的协议。

二、应用场景

SSE适用于需要实时推送数据的场景,比如股票行情、聊天室等。由于SSE使用的是HTTP协议,因此可以利用HTTP的缓存机制来提高性能。另外,SSE还可以通过设置retry字段来自动重连,以保证连接的稳定性。

WebSocket适用于需要双向通信的场景,比如在线游戏、视频会议等。由于WebSocket使用的是TCP连接,因此可以保证数据传输的稳定性和可靠性。

另外,WebSocket还支持二进制数据传输,可以用于传输音视频等大文件。

三、性能方面

SSE和WebSocket在性能方面也存在差异。由于SSE使用的是HTTP协议,因此每次发送数据都需要重新建立HTTP连接,这会导致额外的开销。另外,由于SSE只能由服务器向客户端发送数据,因此无法进行双向通信。

WebSocket则不存在这些问题,它使用的是TCP连接,可以保持长连接,避免了每次建立连接的开销。另外,由于WebSocket支持双向通信,因此可以在客户端和服务器之间进行实时的交互。

四、小结结

SSE和WebSocket都是实现服务器推送数据到客户端的技术,但它们在实现方式、应用场景和性能方面存在差异。

SSE适用于需要实时推送数据的场景,而WebSocket适用于需要双向通信的场景。

在性能方面,WebSocket更加优秀,可以保持长连接和实时交互。因此,在选择技术时需要根据具体需求进行选择。


Code

在现代Web应用程序中,实时数据的需求越来越普遍。传统的Ajax轮询和长轮询技术虽然可以实现实时数据的更新,但是它们都存在一些缺点,比如服务器负载过高和延迟高等问题。而SSE(Server-Sent Events)技术则是一种更加高效的实时数据更新方式。

SSE是一种基于HTTP协议的服务器推送技术。它允许服务器向客户端推送数据,而不需要客户端发起请求。SSE使用了一个长连接,服务器可以随时向客户端发送数据,从而实现实时更新。

SSE协议定义了一种特殊的HTTP响应格式,称为“text/event-stream”。客户端通过订阅这个特殊的HTTP响应,就可以接收到服务器推送的数据。SSE还支持事件类型和注释等特性,可以更好地组织和解析推送数据。


在Spring Boot中使用SSE

在这里插入图片描述

在Spring Boot中使用SSE非常简单。首先,我们需要添加一个依赖:

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

我们使用 webflux ,再加个

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

然后,在我们的Controller中添加一个@RequestMapping注解,并指定produces属性为"text/event-stream":

@RestController
public class SSEController {

    @RequestMapping(value = "/sse", produces = "text/event-stream")
    public ResponseEntity<Flux<String>> sse() {
        Flux<String> flux = Flux.interval(Duration.ofSeconds(1)).map(i -> "message " + i);
        return ResponseEntity.ok().body(flux);
    }
}

上面的代码定义了一个名为“/sse”的路由,它返回一个Flux对象。Flux是一个响应式流,它可以产生无限个元素,并在每个元素之间产生指定的时间间隔。在上面的例子中,我们每隔1秒钟发送一条消息。

最后,我们需要在客户端订阅这个路由,以接收服务器推送的数据。在JavaScript中,可以使用EventSource对象来订阅SSE:

var eventSource = new EventSource('/sse');
eventSource.onmessage = function(event) {
    console.log('Received message: ' + event.data);
};

上面的代码创建了一个EventSource对象,并订阅了“/sse”路由。当服务器推送消息时,会触发onmessage回调函数,并打印收到的消息。

index的全部代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SSE-DEMO</title>
</head>
<body>

<h1>SSE - Flux</h1>
<div id="sse-flux"></div>

<script>
    const eventSource = new EventSource('/sse');
    eventSource.onmessage = function (event) {
        document.getElementById("sse-flux").innerHTML = event.data;
        console.log('Received message: ' + event.data);
    };
</script>
</body>
</html>

测试

在这里插入图片描述


总结

我们介绍了如何在Spring Boot中使用SSE技术来实现实时数据更新。SSE是一种非常高效和易用的服务器推送技术,它可以大大提高Web应用程序的实时性能。在使用SSE时,我们需要定义一个路由,并返回一个Flux对象。客户端可以通过EventSource对象来订阅这个路由,并接收服务器推送的数据。

如果正在开发一个需要实时数据更新的Web应用程序,那么不妨考虑使用SSE技术来实现。它可以让应用程序更加高效、快速和可靠。

在这里插入图片描述

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

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

相关文章

计算机网络|第六章:链路层和局域网

目录 &#x1f4da;链路层概述 &#x1f407;链路层提供的服务 &#x1f407;链路层在何处实现 &#x1f4da;差错检测和纠正技术 &#x1f407;奇偶校验 &#x1f407;检验和方法 &#x1f407;循环冗余检测⭐️ &#x1f4da;多路访问链路和协议 &#x1f407;信道划…

前端:开源免费的浏览器端Markdown编辑器——Vditor上手体验

今天给大家聊聊一款开源免费的浏览器端Markdown编辑器——Vditor&#xff0c;非常的好用&#xff0c;分享给大家&#xff01; 一、编辑器简介 Vditor 是一款浏览器端的 Markdown 编辑器&#xff0c;支持所见即所得、即时渲染&#xff08;类似 Typora&#xff09;和分屏预览模式…

chatgpt赋能python:用Python轻松处理奇偶数——Python奇偶数处理教程

用Python轻松处理奇偶数——Python奇偶数处理教程 什么是奇偶数&#xff1f; 在数学中&#xff0c;任何整数都可以被分为两类&#xff1a;奇数和偶数。奇数是指不能被2整除的整数&#xff0c;而偶数是指可以被2整除的整数。例如&#xff0c;1、3、5、7等都是奇数&#xff0c;…

阵列卡缓存 RAID Cache

简介 磁盘阵列(Redundant Arrays of Independent Drives&#xff0c;RAID)&#xff0c;有“独立磁盘构成的具有冗余能力的阵列”之意。 RAID卡电路板上的一块存储芯片&#xff0c;与硬盘盘片相比&#xff0c;具有极快的存取速度&#xff0c;实际上就是相对低速的硬盘盘片与相…

TypeScript 的魔法技能:satisfies

现在&#xff0c;随着 TS 4.9 的发布&#xff0c;在 TypeScript 中有了一种新的、更好的方式来做类型安全校验。它就是 satisfies &#xff1a; type Route { path: string; children?: Routes } type Routes Record<string, Route>const routes {AUTH: {path: &quo…

MySQL-索引详解(上)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️树高千尺&#xff0c;落叶归根人生不易&…

零入门kubernetes网络实战-34->将物理网卡eth0挂载到虚拟网桥上使得内部网络能够跨主机ping通外网的方案

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本篇文章模拟一下啊&#xff0c;将宿主机的对外的物理网卡&#xff0c;挂载到虚拟网桥上&#xff0c;测试一下&#xff0c; 网桥管理的内部网络如何跟宿主…

华为OD机试真题 Java 实现【太阳能板最大面积】【2022Q4 100分】,附详细解题思路

一、题目描述 给航天器一侧加装长方形或正方形的太阳能板&#xff08;图中的红色斜线区域&#xff09;&#xff0c;需要先安装两个支柱&#xff08;图中的黑色竖条&#xff09;&#xff0c;再在支柱的中间部分固定太阳能板。 但航天器不同位置的支柱长度不同&#xff0c;太阳…

Linux账号管理与ACL权限设定(二)

使用者身份切换 通常以一般账号登录系统&#xff0c;若有系统维护或软件更新才需要转为root身份来操作。 su 若要完整的切换到新使用者的环境&#xff0c;必须要用 su – username &#xff0c;才会连同环境 PATH/USER/MAIL 等变量都转成新用户的环境。 若仅想执行一次root…

Linux学习[14]默认文本编辑vi/vim介绍常用指令演示指令汇总

文章目录 前言&#xff1a;1. vi介绍2. 指令演示2.1 vi创建文件2.2 添加文本 3. 指令汇总3.1 一般指令模式可用的按钮说明&#xff0c;光标移动、复制贴上、搜寻取代等3.2 进入插入或取代的编辑模式3.3 一般指令模式切换到命令行界面的可用按钮说明 总结 前言&#xff1a; 之前…

pycharm和virtualBox虚拟机的安装(包括本地环境和远程环境配置)

目录 一、安装时需要的软件二、安装virtualBox三、安装pycharm四、创建pycharm本地环境五、创建pycharm远程环境 一、安装时需要的软件 Pycharm&#xff0c;jetbrains-agent-latest破解包&#xff08;破解pycharm&#xff09;;镜像文件ubuntu20&#xff0c;虚拟机virtualBox …

【Android】通过Profiling工具和adb确定app被系统杀死的原因

当您想要确定安卓App被系统杀死的原因时&#xff0c;可以通过以下步骤进行分析&#xff1a; 打开Android Studio中的Profiling工具 在您的项目中&#xff0c;打开Android Studio并进入Profiling工具。点击左上角的“Android Profiler”图标&#xff0c;选择“CPU”或“Memor…

【Linux】Linux编译器 gcc/g++的使用初识动静态链接库

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【Linux】…

chatgpt赋能python:Python处理DICOM文件

Python处理DICOM文件 DICOM (Digital Imaging and Communications in Medicine)是医疗图像和数据的标准&#xff0c;用于存储和交换医学图像和相关信息。在医疗领域中&#xff0c;DICOM文件是医生和医学技师进行诊断和治疗的必要条件。在本文中&#xff0c;我们将介绍如何使用…

Linux下配置Qt6安卓开发环境

安装JDK 选择自己定义JDK安装路径 点击如下图按钮 安装SDK 提示TLS初始化失败 由于HTTPS问题造成无法下载,暂用Android Studio来安装Android SDK 成功安装SDK 安装NDK与命令行工具 正在下载NDK及命令行工具 NDK与工具下载完成 配置QT的Android SDK路径 配置NDK路径 选择ND…

Nginx服务性能和安全优化(念念不忘,必没回响)

一、配置Nginx隐藏版本相关信息 1.隐藏版本号 修改 nginx.conf 文件&#xff0c;在http块中添加字段后&#xff0c;重载服务 获取报文信息并查看&#xff08;浏览器查看或使用命令&#xff09; 2.修改版本号及相关信息 如果做了上一步在nginx.conf 中添加了 server_tokens…

数据结构-二分查找

1.1 什么是算法&#xff1f; 定义 在数学和计算机科学领域&#xff0c;算法是一系列有限的严谨指令&#xff0c;通常用于解决一类特定问题或执行计算 In mathematics and computer science, an algorithm (/ˈlɡərɪəm/) is a finite sequence of rigorous instructions, …

【Spring Cloud Gateway】⑥SpringBoot3.x集成SpringDoc指南

文章目录 背景本地开发环境介绍pom.xml主要依赖application.yml效果预览动态生成swagger文档分组效果预览在线文档 背景 Spring Cloud Gateway使用Netty作为嵌入式服务器&#xff0c;并基于响应式Spring WebFlux。做为微服务网关&#xff0c;多个微服务把API挂在Gateway上&…

轻量实时操作系统学习(二)

306xH系列架构 主系统包含以下部件&#xff1a; maters&#xff1a;RISC-V CPU、DMA、CORESIGHTslaves&#xff1a;嵌入式SYSRAM、嵌入式Flash memory、系统外设 这些模块通过AMBA总线架构互连&#xff0c;如图所示。 TCM_BUS&#xff1a;此总线将RISC-V CPU的TCM接口与存…

STM32学习(十四)

低功耗 降低集成电路的能量消耗。 低功耗特性对用电池供电的产品&#xff1a; 更小电池体积&#xff08;降低了大小和成本&#xff09; 延长电池寿命 电磁干扰更小&#xff0c;提高无线通信质量 电源设计更简单&#xff0c;无需过多考虑散热问题 STM32具有运行、睡眠、停止和…