接收服务端请求,WebSocket 并非唯一选择!(含:ChatGPT 流推送原理解析)

前端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~

Hello,大家好,我是 Sunday。

说到推送数据,大家可能首先想到的是 WebSocket

事实上,WebSocket 允许双向通信,自然可以用于服务器到浏览器的消息推送。

然而,如果只需要单向消息推送,HTTP 也可以通过服务器发送事件来实现这一功能。

WebSocket的通信流程如下:

  • 首先,通过HTTP切换协议。 服务器返回状态码101后,协议切换成功。
  • 然后,WebSocket 格式数据的通信开始,一方可以随时向另一方推送消息。

01:啥是 SSE

对于 HTTP 中服务器发送的事件:

服务器返回的 conteng-typetext/event-stream,这是一个可以多次返回内容的流。服务器端事件通过这种消息类型随时推送数据。我们把它叫做 SSE

在ChatGPT 中。每次回答问题时,它不会立即给出所有答案,而是逐步加载部分。这也是基于SSE的。

现在我们知道什么是 SSE 及其应用,那么如何实现一个 SSE 呢E

02:实现 SSE

创建一个 nest 项目

npx nest new sse-test

运行之后可以看到以下内容:

然后,我们可以在 AppController 中添加一个流(stream)接口。

这里并没有通过@Get、@Post等装饰器来标识,而是通过@Sse装饰器表明这是一个事件流类型的接口。

@Sse('stream')
stream() {return new Observable((observer) => {observer.next({ data: { msg: 'aaa'} });setTimeout(() => {observer.next({ data: { msg: 'bbb'} });}, 2000);setTimeout(() => {observer.next({ data: { msg: 'ccc'} });}, 5000);});
}

它返回的是一个Observable对象,然后内部使用observer.next返回消息。 可以返回任何 JSON 数据。

我们首先返回aaa,2秒后我们返回bbb,5秒后我们返回ccc。

然后创建一个前端页面:创建一个 React 项目。

npx create-react-app --template=typescript sse-test-frontend

App.tsx中写入以下代码:

import { useEffect } from 'react';function App() {useEffect(() => {const eventSource = new EventSource('http://localhost:3000/stream');eventSource.onmessage = ({ data }) => {console.log('New message', JSON.parse(data));};}, []);return (<div>hello</div>);
}export default App;

该EventSource是一个本机浏览器API,用于从SSE接口获取响应。 它将把每条消息传递到回调函数 onmessage 中。

我们在 Nest 服务中启用跨域支持。

然后删除react项目的index.tsx文件中的这几行代码,因为它们会导致额外的渲染:

执行 React 项目:npm run start

你可以看到以下内容:

这里的打印,就是服务器发送的事件。

在devtools中,我们可以看到响应的Content-Type是text/event-stream

然后在EventStream中,可以看到每条收到的消息。

这样服务器就可以随时向网页推送消息啦!

我们可以在 MDN 上看到它的兼容性列表:

除IE和Edge外,与其他浏览器不存在兼容性问题。

03:SSE 的应用场景

Server-Sent Events 特别适合 只需要服务器端推送的场景。

比如:GPT 项目、日志的实时推送 等

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

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

相关文章

STM32利用标准库的方式输出PWM(proteus仿真)

首先打开proteus仿真软件&#xff0c;绘制电路图&#xff1a; 其中示波器的添加很简单的&#xff0c;看图&#xff1a; 再来看看咱们最后程序的效果&#xff1a; 下面就是程序代码了&#xff0c;新建两个文件PWM.c和PWM.h文件&#xff0c;所属关系如图&#xff1a; 整个的编程思…

VBA_NZ系列工具NZ02:VBA读取PDF使用说明

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…

亚马逊店铺解决和预防订单下滑的技巧

1. 保持账号的良好表现。不要销售侵权产品&#xff0c;发货要及时&#xff0c;能有追踪号的就带可查询追踪号&#xff0c;能发FBA的就通过FBA发货。 2. 持续做好产品优化工作&#xff0c;及时留意大环境的变化和平台政策变动。遇到编辑权限受限&#xff0c;可开case咨询或申请…

LeetCode.2129. 将标题首字母大写

&#x1f354;题目 2129. 将标题首字母大写 &#x1f35f;分析 这道题目描述的很清晰&#xff0c;我们只需要将给定的字符串按照空格划分成字符串数组 str&#xff0c;然后判断 str[i] 的长度如果 <2 &#xff0c;则将 str[i] 转为小写&#xff0c;如果 str[i] 的长度 &g…

JVM 面试题

1、什么情况下会发生栈内存溢出。 栈内存溢出通常发生在以下几种情况中&#xff1a; 函数递归调用过深&#xff1a; 当函数递归调用自身且没有合适的退出条件时&#xff0c;每次递归调用都会在栈上分配一个新的栈帧来存储局部变量、返回地址等信息。如果递归层次过多&#xff…

[数据集][图像分类]棉花叶子病害分类数据集2293张4类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;2293 分类类别数&#xff1a;4 类别名称:["diseased_cotton_leaf"…

基于多源信息融合的巡飞弹对地目标识别与毁伤评估

源自&#xff1a;系统仿真学报 作者&#xff1a;徐艺博 于清华 王炎娟 郭策 冯世如 卢惠民 摘 要 面向利用多枚巡飞弹对地面高防御移动目标进行打击的任务场景&#xff0c;提出一种基于多源信息融合的巡飞弹对地移动目标识别与毁伤评估方法。基于IoU判定实现红外图像与可…

E2697A 安捷伦高阻抗适配器

181/2461/8938描述: E2697A高阻抗适配器允许将需要高阻抗输入的探头&#xff08;例如无源探头、电流探头&#xff09;连接到Infiniium 54850、80000和90000系列高性能示波器。E2697A高阻抗适配器扩展了Agilent Infiniium高性能示波器的功能&#xff0c;使其成为电源、逆变器、…

闭包的理解和使用场景

文章目录 一、是什么二、使用场景柯里化函数使用闭包模拟私有方法其他 三、注意事项 一、是什么 一个函数和对其周围状态&#xff08;lexical environment&#xff0c;词法环境&#xff09;的引用捆绑在一起&#xff08;或者说函数被引用包围&#xff09;&#xff0c;这样的组…

2024-03-10 c++

&#x1f338; MFC下拉框控件 | Combo Box eg 计算器 1。新建MFC项目&#xff08;基于对话框、静态库&#xff09; 2。添加控件&#xff0c;删除初始的3个多余控件 加3个edit control 加1个combo box&#xff0c;属性sort改为false&#xff0c;data为 ;-;;;% 加1个static text…

数据可视化引领工业智能化时代的浪潮

随着工业数字化的迅速发展&#xff0c;数字孪生技术作为一项新兴技术&#xff0c;正日益受到工业界的关注和应用。数字孪生是将实际物理对象或过程与其数字化模型相连接的先进技术。通过数字孪生&#xff0c;工业企业可以在虚拟世界中模拟和测试现实世界的产品和生产过程&#…

js 添加、删除DOM元素

1. js添加、删除DOM元素 1.1. 添加DOM元素 1.1.1. appendChild()方法 该方法添加的元素位于父元素的末尾&#xff0c;使用方法&#xff1a; parentNode.appenChild(NewNode) // parentNode是需要添加元素的容器&#xff0c;NewNode是新添加的元素   创建一个li元素并添加到…

系统分析师论文总结【持续更新】

2024年3月4日&#xff0c;新的软考规则出来&#xff0c;高项改为一年一次&#xff0c;架构师改为一年两次。 下半年考试安排&#xff0c;如下图&#xff08;来源官网&#xff09; 收集整理系统分析师论文&#xff0c;方便备查。 一、2010年论文 1、论软件维护及软件课维护性…

【STM32】HAL库 CubeMX 教程 --- 高级定时器 TIM1 定时

实验目标&#xff1a; 通过CUbeMXHAL&#xff0c;配置TIM1&#xff0c;1s中断一次&#xff0c;闪烁LED。 一、常用型号的TIM时钟频率 1. STM32F103系列&#xff1a; 所有 TIM 的时钟频率都是72MHz&#xff1b;F103C8不带基本定时器&#xff0c;F103RC及以上才带基本定时器。…

现代DevOps如何改变软件开发格局

在软件开发的早期&#xff0c;该过程通常是开发人员编写代码&#xff0c;再将其交给质量保证&#xff08;QA&#xff09;进行测试。这种瀑布开发方法可能会导致质量问题和延迟&#xff0c;因为问题是在周期后期发现的。 一、了解DevOps和测试左移 DevOps是Development和Opera…

解决Gradle下载过慢问题的有效方式:使用国内镜像站点

前言 在开发过程中&#xff0c;我们经常会遇到Gradle下载速度缓慢或超时的问题。作为一个强大而流行的构建工具&#xff0c;Gradle是许多项目中必不可少的一部分。然而&#xff0c;由于官方下载地址可能受网络限制影响&#xff0c;导致下载速度较慢。针对这个问题&#xff0c;…

【题解】—— LeetCode一周小结10

【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结9 4.用栈实现队列 题目链接&#xff1a;232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a…

基于ACM32 MCU的电动滑板车方案了,助力低碳出行

随着智能科技的快速发展&#xff0c;电动滑板车的驱动系统也得到了长足的发展。国内外的电动滑板车用电机驱动系统分为传统刷式电机和无刷电机两种类型。其中&#xff0c;传统的刷式电机已经逐渐被无刷电机所取代&#xff0c;无刷电机的性能和寿命都更出色&#xff0c;已成为电…

【APP逆向】酒仙网预约茅台程序,包含逆向过程详解

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属的专栏:爬虫实战,零基础、进阶教学 景天的主页:景天科技苑 文章目录 酒仙网预约抢购茅台1.抓包分析,账户名和密码登录2.短信登录3.登录+茅台预约 密码登录酒仙网预约抢购茅台 目标:账号登…

退磁曲线方形度Q与膝点Hk

大家都知道衡量钕铁铁磁体性能的指标包括剩磁Br、矫顽力HcB、内禀矫顽力HcJ和最大磁能积(BH)max&#xff0c;除此之外&#xff0c;内禀曲线方向度和Hk也是磁应用工程师非常关注的两个指标&#xff0c;今天就来了解一下这两个指标的含义及影响因素。 首先我们先来回顾一下什么是…