服务器往浏览器推消息(SSE)应用
1,SSE 和 WebSocket 对比
SSE(服务器发送事件)
SSE是一种基于HTTP的单向通信机制,用于服务器向客户端推送数据。它的工作原理如下:
建立连接:客户端通过发送HTTP请求与服务器建立连接。在请求中,客户端指定了接收事件的终点(Endpoint)。
保持连接:服务器接收到连接请求后,保持连接打开,并定期发送事件数据给客户端。
事件流:服务器使用 “Content-Type: text/event-stream” 头部标识SSE连接,并使用特定格式的数据(事件流)发送给客户端。
客户端处理事件:客户端通过JavaScript的 EventSource 接口监听SSE连接,一旦接收到事件,就可以处理数据并更新页面。
SSE的特点和适用场景:
单向通信:SSE是从服务器到客户端的单向通信模型,只能由服务器推送数据给客户端。
实时更新:SSE适用于需要实时更新数据的应用场景,如股票行情、新闻推送等。
简单易用:使用SSE相对简单,无需额外的库或框架支持,可以直接使用浏览器的原生API进行开发。
WebSocket
WebSocket是一种全双工的通信协议,它通过在客户端和服务器之间建立持久连接,实现双向通信。WebSocket的工作原理如下:
握手阶段:客户端向服务器发送WebSocket握手请求,服务器返回握手响应。在这个阶段,客户端和服务器协商选择协议和版本。
建立连接:握手成功后,客户端和服务器之间建立持久连接,可以进行双向数据传输。
双向通信:一旦连接建立,客户端和服务器都可以主动发送消息给对方。数据可以以文本或二进制格式进行传输。
断开连接:当任一方决定关闭连接时,可以发送关闭帧来终止连接。
WebSocket的特点和适用场景:
双向通信:WebSocket支持双向通信,客户端和服务器可以互相发送消息。
实时互动:WebSocket适用于实时互动的应用场景,如聊天应用、协作编辑等。
复杂性和灵活性:相对于SSE,WebSocket更为灵活,可以处理更复杂的通信需求。它允许自定义消息格式、心跳检测、连接状态管理等。
2,具体代码实现
2.1 后端
@GetMapping(value = "/stock",produces = MediaType.TEXT_EVENT_STREAM_VALUE)public SseEmitter streamStockPrice() {SseEmitter emitter = new SseEmitter();// 模拟生成实时股票价格并推送给客户端Random random = new Random();new Thread(() -> {try {while (true) {// 生成随机的股票价格double price = 100 + random.nextDouble() * 10;// 构造股票价格的消息String message = String.format("%.2f", price);// 发送消息给客户端emitter.send(SseEmitter.event().data(message));// 休眠1秒钟Thread.sleep(1000);}} catch (Exception e) {emitter.completeWithError(e);}}).start();return emitter;}
2.2 前端
$("#btn12").click(function (){const eventSource = new EventSource('http://localhost:8080/test/test/stock');eventSource.onmessage = function (event) {showMsg(event.data)}})
2.3 最终效果
SSE 演示
3,传统部署方式
nginx部署


4,k8s部署方式
待研究
5,问题
问题 1:采用 nginx 部署时,页面刷新很慢,实际上服务器已经发了很多数据过来。
此问题待研究解决。

解决方法:
nginx 做相关配置
配置如下
location /codeTest {proxy_pass http://127.0.0.1:18080/test;# proxy_http_version设置代理使用的HTTP协议版本为1.1。proxy_http_version 1.1;proxy_set_header Connection "";proxy_set_header X-Real-IP $remote_addr;proxy_set_header Host $host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# SSE 连接时的超时时间proxy_read_timeout 86400s;# 取消缓冲proxy_buffering off;# 关闭代理缓存proxy_cache off;# 禁用分块传输编码#chunked_transfer_encoding off}
/codeTest是你希望使用的路径,你可以根据需要进行修改。 proxy_pass指定了后端服务器的地址,你需要将其替换为实际的后端服务器地址。
proxy_http_version设置代理使用的HTTP协议版本为1.1。
proxy_set_header设置一些必要的头部信息,如连接方式、真实客户端IP等。
proxy_read_timeout 指令来设置 SSE 连接的超时时间。默认情况下,Nginx 会在 60 秒后关闭空闲的连接,这对于 SSE 来说是不合适的,所以我们将超时时间设置为一天(86400 秒)。这样,客户端和服务器之间的连接可以持续保持打开状态。
proxy_buffering off 指令来确保数据可以实时传输,而不需要等待缓冲区满。在SSE请求中禁用缓冲,以便正确处理SSE流式数据。
proxy_cache 对于 SSE(Server-Sent Events)连接,通常不建议启用 Nginx 的代理缓存(proxy_cache)。因为 SSE 是一种长连接技术,它通过保持持久连接来实时推送数据给客户端,而代理缓存会将响应数据缓存起来并在后续请求中返回缓存的响应,这与 SSE 的工作方式相违背。如果启用代理缓存,Nginx 可能会缓存 SSE 的数据,并在后续的连接中返回相同的缓存数据,这样会导致客户端收到重复的消息,破坏了 SSE 的实时性和准确性。
chunked_transfer_encoding 参数可以根据你的需求决定是否关闭。在 SSE 中,通常不需要禁用分块传输编码,因为它允许将数据以数据块的形式逐步传输,与 SSE 的流式数据特性相符合。
proxy_pass 指令正确反向代理到你的 SSE 应用程序的地址和端口,以使连接正确工作。
问题 2:连接一段时候,自动断开


解决方法参考如下文章
Springboot调整接口响应返回时长(解决响应超时问题)

相关文章:
服务器往浏览器推消息(SSE)应用
1,SSE 和 WebSocket 对比 SSE(服务器发送事件) SSE是一种基于HTTP的单向通信机制,用于服务器向客户端推送数据。它的工作原理如下: 建立连接:客户端通过发送HTTP请求与服务器建立连接。在请求中ÿ…...
Choreographer
系统面试的时候常会遇到,比如它是什么,是用来做什么用的。或许我们大概清楚,但不一定能表达清楚。 在Android框架中,Choreographer(舞台监督)是一个用于管理和协调UI线程上的动画和绘制操作的系统组…...
CentOS有IP地址,连接不上Xshell或使用Xshell时突然断开
问题原因:未在电脑主机的网络中进行IP地址配置 解决办法: 1.打开控制面板,选择‘网络与共享中心’ 2.选择“更改适配器设置” 3.右键点击以太网3“属性” 4.选择协议版本4,点击属性 5.IP地址填写CentOS的IP地址:192.…...
工业电子中的深力科分享一款PWM控制器 KA3525A
关于PWM控制器: PWM控制器是一种用于控制电机或其他设备的电路,它通过改变脉冲宽度调制(PWM)信号的占空比来控制设备的输出。PWM控制器可以使用单片机或开发板等设备来实现,通过设定占空比,可以轻松地控制…...
【小白专用】安装Apache2.4+ 安装PHP8.2+ php与sql server 2008 r2连接测试教程
PHP安装 1、PHP下载 PHP For Windows: Binaries and sources Releases 注意: 1.要下载Thread Safe,否则没有php8apache2_4.dll这个文件 2.如果是64位系统要下载x64的,x86的不行 3.下载Zip 2、PHP解压安装 将Zip进行解压,里…...
408计算机网络知识点简记 (背诵用
1. 物理层 1. 奈氏和香农 意义不同:奈氏准则鼓励用更优编码码元(2W是码元/s);香农给出数据传输上限C(1. 不可能高过C,2. 若低于C,一定有手段做到C) C = W ∗ l o g 2 ( 1 + S N ) C =W * log_2(1+\frac{S}{N}) C=W∗log2(1+NS) 信噪比 = 10 ∗ l o g 10 ( S N …...
SQL*PLUS对文本长度的限制
SQL*PLUS对文本长度的限制 一、可解决SQL * Plus行长限制的部分选项:二、SQL * plus 因为以上限制导致脚本执行过程可能遇到的错误1、CLOB字段超4000报ORA-22835或ORA-017042、CLOB处理:SP2-0027: 输入太长 (> 2499 个字符) 收到错误SP2-0027…...
配置Insecure Docker Registry支持http请求 (更改默认的https请求)
文章目录 小结问题解决参考 小结 本文记录了如何配置Insecure http docker registry,也就是使用http请求 (更改默认的https请求)Docker Registry仓库。 问题 在测试环境中没有配置SSL/TLS, 需要使用http请求Docker Registry&am…...
BAT032:批量替换当前目录下文件的部分字符
引严:编写批处理程序,实现批量替换当前目录下文件的部分字符。 一、新建Windows批处理文件 参考博客: CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件,点击【编辑】。…...
uni-app:js实现数组中的相关处理
一、查询数组中,某一项中的某个数据为指定值的项(find() 方法) 使用分析 使用数组的 find() 方法来查询 id 为 0 的那一项数据。这个方法会返回满足条件的第一个元素,如果找不到符合条件的元素,则返回 undefined。使用…...
51系列—基于51单片机的数字频率计(代码+文档资料)
本文主要说明基于51单片机的数字频率计设计,完整资料见文末链接 数字频率计概述 数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。它是一种用十进制数字显示被测信号频率的数字测量仪器。它的基本功能是测量正弦信号,方波信…...
【SA8295P 源码分析 (四)】44 - 如何替换 NON-HLOS.bin 中的 Wifi Firmware 固件
【SA8295P 源码分析】44 - 如何替换 NON-HLOS.bin 中的 Wifi Firmware 固件 1、提取 NON-HLOS.bin 中的 Wifi Firmware 出来2、把提取出来的 wifi 固件放到代码中3、重新打包生成 NON-HLOS.bin4、将生成的 NON-HLOS.bin 与 老的 NON-HLOS.bin 对比5、使用fastboot 下载测试wifi…...
Aspect Android埋点统计activity页面使用时长 onResume onPause,并保存时长
Aspect Android埋点统计activity页面使用时长 onResume onPause,并保存时长 标记: 1.项目下build.gradle dependencies {classpath com.android.tools.build:gradle:3.5.4classpath com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10 } 2.…...
第四章 选择结构程序设计
C语言有两种选择语句:(1)if语句,实现两个分支的选择结构; (2)Switch语句,实现多分支的选择结构。 1.求ax^2bxc0方程的解。 #include<stdio.h> #include<math.h> int …...
JAVA高级教程-Java List(2)
目录 3、List接口的使用(1)3、List接口的使用(3)4、排序,集合之间的转换 3、List接口的使用(1) package ArrayList01;import java.util.ArrayList; import java.util.Iterator; import java.ut…...
Spark--经典SQL50题
目录 连接数据库准备工作 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数 2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数 3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩 4、查询平均成绩…...
数据结构: AVL树
目录 1.AVL树的概念 2.AVL树的模拟实现 AVL树的结构定义 插入 对平衡因子的讨论 旋转 对旋转情况的讨论 1.单旋 1.1左单旋 1.2右单旋 2.双旋 2.1左右双旋 2.2右左双旋 检查是否是AVL树 1.AVL树的概念 当向二叉搜索树中插入新结点后,如果能保证每个结点…...
LeetCode-高频 SQL 50 题:连接 篇
目录 1378. 使用唯一标识码替换员工ID 题目描述: SQL语句: 1068. 产品销售分析 I 题目描述: SQL语句: 1581. 进店却未进行过交易的顾客 题目描述: SQL语句: 197. 上升的温度 题目描述࿱…...
操作系统备考学习 day10
操作系统备考学习 day10 第三章 内存管理3.2 虚拟内存管理3.2.1 虚拟内存的基本概念传统存储管理方式的特征、缺点局部性原理虚拟内存的定义和特征如何实现虚拟内存技术 3.2.2 请求分页管理方式页表机制缺页中断机构地址变换机构 3.2.3 页面置换算法最佳置换算法(OP…...
基于侏儒猫鼬优化的BP神经网络(分类应用) - 附代码
基于侏儒猫鼬优化的BP神经网络(分类应用) - 附代码 文章目录 基于侏儒猫鼬优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.侏儒猫鼬优化BP神经网络3.1 BP神经网络参数设置3.2 侏儒猫鼬算法应用 4.测试结果…...
【独家解析】Ernie-Image-AIO-Rapid一键部署本地运行整合包:深度融合架构如何重塑AI绘图效率?4K超分与硬件适配全指南
一、 引言:AI绘画的“快”时代 在AI图像生成领域,速度与质量的平衡一直是开发者追求的终极目标。随着Ernie-Image-AIO-Rapid的发布,这一平衡被彻底打破。不同于传统的模块化分步渲染,该模型基于**AIO(All-In-One&#…...
Windows屏幕采集进阶:手把手教你用DXGI对接NVIDIA NVENC实现硬件编码
Windows屏幕采集与硬件编码实战:DXGI对接NVENC全流程解析 在实时视频流处理领域,屏幕采集与硬件编码的高效结合一直是开发者面临的挑战。传统方案往往需要在GPU和CPU之间频繁拷贝数据,导致延迟增加和性能下降。本文将深入探讨如何利用DXGI直接…...
【超全步骤】2026年Hermes Agent/OpenClaw阿里云7分钟简易集成指南
【超全步骤】2026年Hermes Agent/OpenClaw阿里云7分钟简易集成指南。OpenClaw(前身为Clawdbot/Moltbot)作为开源、本地优先的AI助理框架,凭借724小时在线响应、多任务自动化执行、跨平台协同等核心能力,成为个人办公与轻量团队协作…...
终极指南:如何用chrome-extensions-searchReplace将网页文本批量处理效率提升5倍
终极指南:如何用chrome-extensions-searchReplace将网页文本批量处理效率提升5倍 【免费下载链接】chrome-extensions-searchReplace 项目地址: https://gitcode.com/gh_mirrors/ch/chrome-extensions-searchReplace 在网页内容编辑和批量修改工作中&#x…...
【企业级低代码落地白皮书】:基于VSCode的12类业务组件自动化配置标准(附Gartner认证配置模板)
更多请点击: https://intelliparadigm.com 第一章:VSCode低代码插件的核心架构与企业适配原则 VSCode低代码插件并非传统IDE扩展的简单功能叠加,而是以“可组合式前端抽象层 声明式后端契约”为双核驱动的轻量级集成架构。其核心由三部分构…...
2026离火运下的商业破局 七大反周期赛道深度解码,企业的掘金指南
作为扎根云南本土、服务超 3 万家企业的 AI 营销与数字化转型服务商,我们基于对云南市场 6 年的深耕洞察,深刻理解本土企业在时代浪潮中的机遇与挑战。在 “火马年 离火运” 的宏观趋势下,那些逆周期生长的商业赛道,不仅是全国性…...
Transformer位置编码插值与YaRN技术解析
1. 位置编码插值与YaRN扩展技术解析在自然语言处理领域,Transformer架构已成为处理序列数据的标准方案。其核心组件之一的位置编码系统,决定了模型对序列顺序的理解能力。传统固定长度位置编码在面对超长文本时面临两大挑战:训练阶段未见过的…...
Grounding DINO实战:用Python+OpenCV打造一个“你说我找”的智能图片搜索工具
用Grounding DINOOpenCV构建智能图片搜索工具:从理论到工程实践 1. 项目背景与核心价值 在数字内容爆炸式增长的时代,如何快速从海量图片中精准定位目标内容成为刚需。传统基于标签的图片检索系统存在标注成本高、泛化能力差的问题,而基于自然…...
从AI到抗量子:下一代金融基础设施正在发生什么变化?
在过去几年中,金融科技行业的讨论焦点,经历了几次明显的转移:从区块链性能,到Web3应用,再到AI与自动化。而当这些技术逐渐交叉,一个更底层的问题开始浮现:来的金融系统,应该建立在什么样的基础之上?这不仅是技术问题,更是结构问题。一、AI正在改变的,不只是效率,而是“决策方式…...
回顾AQATrack模型遇到的问题
1.环境 (1)如果只是pytorch的版本是CPU,直接在这个环境里面去修改那个版本改为GPU就可以了,不用整个环境去打包,打包环境进行迁移的灵感💡来源于deepseek的离谱建议 具体操作步骤: 确认 CUDA …...
