介绍Server-Sent Events,以及使用,超级简单!

一、SSE 的本质

严格地说,HTTP 协议无法做到服务器主动推送信息。但是,有一种变通方法,就是服务器向客户端声明,接下来要发送的是流信息(streaming)。

也就是说,发送的不是一次性的数据包,而是一个数据流,会连续不断地发送过来。这时,客户端不会关闭连接,会一直等着服务器发过来的新的数据流,视频播放就是这样的例子。本质上,这种通信就是以流信息的方式,完成一次用时很长的下载。

SSE 就是利用这种机制,使用流信息向浏览器推送信息。它基于 HTTP 协议,目前除了 IE/Edge,其他浏览器都支持。

二、SSE 的特点

SSE 与 WebSocket 作用相似,都是建立浏览器与服务器之间的通信渠道,然后服务器向浏览器推送信息。

总体来说,WebSocket 更强大和灵活。因为它是全双工通道,可以双向通信;SSE 是单向通道,只能服务器向浏览器发送,因为流信息本质上就是下载。如果浏览器向服务器发送信息,就变成了另一次 HTTP 请求。
在这里插入图片描述

三、SSE 和WebSocket 区别

1、SSE 使用 HTTP 协议,现有的服务器软件都支持。WebSocket 是一个独立协议。
2、SSE 属于轻量级,使用简单;WebSocket 协议相对复杂。
3、SSE 默认支持断线重连,WebSocket 需要自己实现。
4、SSE一般只用来传送文本,二进制数据需要编码后传送,WebSocket 默认支持传送二进制数据。
5、SSE 支持自定义发送的消息类型。
因此,两者各有特点,适合不同的场合。

四、使用

SSE后端代码
SpringMVC中,已经集成了该功能,所以无需额外引入jar包,直接上代码:


@Slf4j
@RestController
@RequestMapping("/sse")
public class SseController {private static final Map<String, SseEmitter> SSE_CACHE = new ConcurrentHashMap<>();/*** 建立连接*/@GetMapping("/connect/{driverId}")public SseEmitter connect(@PathVariable String driverId) {log.info("司机ID:{}", driverId);SseEmitter sseEmitter = new SseEmitter(0L);//注入监听对象SSE_CACHE.put(driverId,sseEmitter);return sseEmitter;}/*** 推送消息*/@GetMapping("/push")public String push(@RequestParam String driverId,@RequestParam String content){try {SSE_CACHE.get(driverId).send(content);} catch (IOException e) {throw new RuntimeException(e);}return "给用户:" + driverId + ",发送了消息:" + content;}/*** 断开连接*/@GetMapping(path = "over")public String over(String driverId) {SseEmitter sseEmitter = SSE_CACHE.get(driverId);if (sseEmitter != null) {sseEmitter.complete();SSE_CACHE.remove(driverId);}return "over";}}

前端代码,简单测试

<html lang="en">
<head><meta charset="UTF-8">
</head><body>
<h1>司机监听测试页面-模拟司机客户端</h1>
<button onclick="setMegContent('鼠标点我了')">测试meg展示</button>
<div id="message">展示服务的推送过来消息的地方</br></div><script>driverId = 1;if (window.EventSource) {console.info("此浏览器支持SSE")source = new EventSource("http://localhost:7000/sse/connect/" + driverId)source.onmessage = function (event) {setMegContent(event.data);};} else {setMegContent("此浏览器不支持SSE")}function setMegContent(content) {document.getElementById("message").innerHTML += (content + '</br>');}
</script></body></html>

效果:
在这里插入图片描述

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

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

相关文章

[四次挥手]TCP四次挥手握手由入门到精通(知识精讲)

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…

【Python教程】3道循环结构练习题,都会了吗?

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 练习1&#xff1a;输入一个数判断是不是素数。 from math import sqrtnum int(input(请输入一个正整数: )) end int(sqrt(num)) is_prime True for x in range(2, end 1):if num % x 0:is_prime Falsebreak if is_prime an…

Spring Cloud Alibaba笔记

&#x1f600;&#x1f600;&#x1f600;创作不易&#xff0c;各位看官点赞收藏. 文章目录 Spring Cloud Alibaba 笔记1、Nacos 服务注册和配置中心1.1、Nacos 之下载启动1.2、Nacos 之注册中心1.3、Nacos 之服务发现1.4、Nacos 之配置中心1.5、Nacos 之分类配置1.6、Nacos 之…

Vue Cli 脚手架安装

Vue Cli 脚手架安装 首先&#xff0c;改一下仓库地址&#xff0c;使用下面的命令cnpm淘宝镜像加速 npm install cnpm -g --registryhttps://registry.npm.taobao.org下载安装 vue 脚手架 npm install -g vue/cli查看 vue cli 脚手架是否安装成功&#xff0c;如果输入命令出现…

联想小新Pro 16笔记本键盘失灵处理方法

问题描述&#xff1a; 联想小新Pro 16新笔记本开机准备激活&#xff0c;到连接网络的时候就开始触控板、键盘失灵&#xff0c;但是有意思的是键盘的背光灯是可以调节关闭的&#xff1b;外接鼠标是正常可以移动的&#xff0c;但是只要拔掉外接鼠标再插回去的时候就不能用了&…

python自动化入门之Python编写脚本实现自动化爬虫详解

想知道如何使用Python轻松高效地获取网络上的信息&#xff1f; 本篇文章将探索Python自动化爬虫&#xff0c;并展示如何编写实用的脚本。 1. 什么是Python爬虫&#xff1f; 爬虫顾名思义&#xff0c;就是像蜘蛛一样在网络上爬行&#xff0c;抓取各种有用信息的一种程序。而Pyt…

【Win】Dell Command PowerShell Provider 一款强大的IT工具

Dell Command | PowerShell Provider 是一款强大的IT工具&#xff0c;它允许用户通过 Windows PowerShell 界面轻松管理 Dell 硬件平台的 BIOS 配置。它提供了一系列的 PowerShell cmdlets命令&#xff0c;这些命令可以帮助 IT 管理员对 Dell 硬件平台进行 BIOS 配置的控制和管…

jmeter进行业务接口并发测试,但登录接口只执行一次

业务接口性能测试&#xff0c;往往都是需要登录&#xff0c;才能请求成功&#xff0c;通常只需要登录一次&#xff0c;再对业务接口多次并发测试。 在测试计划中&#xff0c;添加setUp线程组 把登录请求放入到该线程组中&#xff0c;设置HTTP信息头&#xff0c;JSON提取(提取登…

Blazor 依赖注入妙用:巧设回调

文章目录 前言依赖注入特性需求解决方案示意图 前言 依赖注入我之前写过一篇文章&#xff0c;没看过的可以看看这个。 C# Blazor 学习笔记(10):依赖注入 依赖注入特性 只能Razor组件中注入所有Razor组件在作用域注入的都是同一个依赖。作用域可以看看我之前的文章。 需求 …

使用Nacos配置中心动态管理Spring Boot应用配置

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

微服务概述-7

Shiro 框架 Shiro 是一个用于 Java 应用程序的安全框架。它提供了身份验证、授权、加密和会话管理等功能&#xff0c;可以帮助开发人员构建安全可靠的应用程序。 Java 中针对权限管理常见的有 2 个著名的框架&#xff1a;spring security 和 shiro shiro 基本概念 credentia…

opencv 进阶17-使用K最近邻和比率检验过滤匹配(图像匹配)

K最近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;和比率检验&#xff08;Ratio Test&#xff09;是在计算机视觉中用于特征匹配的常见技术。它们通常与特征描述子&#xff08;例如SIFT、SURF、ORB等&#xff09;一起使用&#xff0c;以在图像中找到相似…

程序员35岁的破局之道

微信公众号访问地址&#xff1a;程序员35岁的破局之道 近期热推文章&#xff1a; 1、springBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表; 2、SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据; 3、基于Redis的Geo实现附近商铺搜索(含源码) 4、基…

【Java】常见面试题:HTTP/HTTPS、Servlet、Cookie、Linux和JVM

文章目录 1. 抓包工具&#xff08;了解&#xff09;2. 【经典面试题】GET和POST的区别&#xff1a;3. URL中不是也有这个服务器主机的IP和端口吗&#xff0c;为啥还要搞个Host&#xff1f;4. 补充5. HTTP响应状态码6. 总结HTTPS工作过程&#xff08;经典面试题&#xff09;7. H…

linux 免交互

Linux 免交互 1、免交互概念2、基本免交互的例子2.1命令行免交互统计2.2使用脚本免交互统计2.3使用免交互命令打印2.4免交互修改密码2.5重定向查看2.6重定向到指定文件2.7重定向直接指定文件2.8使用脚本完成重定向输入2.9免交互脚本完成赋值变量2.10关闭变量替换功能&#xff0…

ipad可以用别的品牌的手写笔吗?开学平价电容笔推荐

开学需要买什么呢&#xff1f;随着科技的不断进步&#xff0c;各种类型的iPad电容笔应运而生。一支好的电容笔&#xff0c;不仅能大大提高我们的工作效率&#xff0c;而且能大大提高我们的生产力。平替的这款电容笔&#xff0c;不管是在技术上&#xff0c;还是在品质上&#xf…

QT 使用图表

目录 1、概念 1.1 坐标轴-QAbstractAxis 1.2 系列-QAbstractSeries 1.3 图例-Legend 1.4 图表-QChart 1.5 视图-QChartView 2、 QT 折线图 2.1 Qt 折线图介绍 2.2 Qt 折线图实现 Qt 图表是专门用来数据可视化的控件 Qt 图表包含折线、饼图、棒图、散点图、范围图等。…

Day16-蜗牛影城后端开发

蜗牛影城后端开发 一 多表关联查询 电影集合movie的type(类别)字段关联到电影类别movieType表的_id(主键) 二 蜗牛影城后端开发 1 数据的导入导出 2 用户模块 UserModel.js //导入mongoose,并解构出Schema(类)和model(对象) const {Schema,model} =

详细了解G1、了解G1、G1垃圾收集器详解、G1垃圾回收器简单调优

4.详细了解G1&#xff1a; 4.1.一&#xff1a;什么是垃圾回收 4.2.了解G1 4.3.G1 Yong GC 4.4.G1 Mix GC 4.5.三色标记算法 4.6.调优实践 5.G1垃圾收集器详解 5.1.G1垃圾收集器 5.2.G1的堆内存划分 5.3.G1的运行过程 5.4.三色标记 5.4.1.漏标问题 5.5.记忆集与卡表 5.6.安全点与…

高并发内存池(centralcache)[2]

Central cache threadcache是每个线程独享&#xff0c;而centralcache是多线程共享&#xff0c;需要加锁&#xff08;桶锁&#xff09;一个桶一个锁 解决外碎片问题&#xff1a;内碎片&#xff1a;申请大小超过实际大小&#xff1b;外碎片&#xff1a;空间碎片不连续&#x…