当前位置: 首页 > article >正文

前端流式接收数据讲解

前端流式接收数据全面讲解

前端流式接收数据(Streaming Data Reception)是现代 Web 应用中一个重要特性,尤其在处理实时通信、大文件传输、聊天、视频播放、实时日志监控等场景下。下面我们从概念到技术实现,再到应用示例,系统全面、细致地讲解前端如何流式接收数据。


一、什么是流式接收数据?

传统方式:前端发起请求,后端准备好完整数据后一次性返回。

流式方式:后端逐步返回数据片段(chunk),前端逐块接收和处理,实现边接收边处理

优点

  • 降低延迟,提升用户体验
  • 节省内存
  • 实现实时响应(如 AI 回答、日志推送)

二、前端接收数据的主流流式方式

我们重点介绍以下几种常见方式:

  1. Fetch + ReadableStream(原生流)
  2. EventSource(Server-Sent Events)
  3. WebSocket(双向通信)
  4. ReadableStream + TransformStream(高级控制)

三、Fetch + ReadableStream(推荐)

1. 使用场景

用于接收后端以流式返回的数据,例如:AI 输出、长日志、文件下载。

2. 示例代码

<button id="start">开始接收流数据</button>
<pre id="output"></pre><script>
document.getElementById("start").addEventListener("click", async () => {const output = document.getElementById("output");output.textContent = "";const response = await fetch("/stream-endpoint");const reader = response.body.getReader();const decoder = new TextDecoder("utf-8");while (true) {const { done, value } = await reader.read();if (done) break;output.textContent += decoder.decode(value, { stream: true });}
});
</script>

3. 后端需支持 chunked 传输(如 Node.js、Flask、FastAPI)


四、EventSource(SSE:服务器推送)

1. 使用场景

适用于服务器主动推送数据,如股票价格、消息通知、日志流。

2. 示例代码

<pre id="log"></pre>
<script>
const log = document.getElementById("log");
const evtSource = new EventSource("/sse");evtSource.onmessage = (event) => {log.textContent += `数据:${event.data}\n`;
};
</script>

3. 服务端要求

  • 设置响应头:Content-Type: text/event-stream
  • 使用 data: 格式发送数据
data: Hello
data: World

五、WebSocket(全双工通信)

1. 使用场景

适用于双向通信场景:聊天室、在线游戏、协同编辑等。

2. 示例代码

<input id="msg" placeholder="输入消息" />
<button onclick="sendMessage()">发送</button>
<pre id="chat"></pre><script>
const ws = new WebSocket("ws://localhost:8080");
const chat = document.getElementById("chat");ws.onmessage = (event) => {chat.textContent += `服务器:${event.data}\n`;
};function sendMessage() {const msg = document.getElementById("msg").value;ws.send(msg);
}
</script>

3. 服务端需实现 WebSocket 协议(如:ws 模块、Socket.IO、FastAPI WebSocket)


六、ReadableStream + TransformStream(更高级的控制)

1. 使用场景

需要对流数据做实时处理、转换,例如分割段落、转义数据。

2. 示例代码

const response = await fetch('/stream');const textDecoderStream = new TextDecoderStream();
const transformStream = new TransformStream({transform(chunk, controller) {const timestamped = `[${new Date().toISOString()}] ${chunk}`;controller.enqueue(timestamped);}
});response.body.pipeThrough(textDecoderStream).pipeThrough(transformStream).pipeTo(new WritableStream({write(chunk) {document.body.innerText += chunk;}}));

七、如何选择合适的方式?

需求建议使用方式
单向、实时推送SSE(EventSource)
双向通信WebSocket
边接收边展示长文本/AI输出Fetch + ReadableStream
需要数据转化、过滤TransformStream

八、常见问题与调试技巧

1. 后端未设置 Transfer-Encoding: chunked

确保响应头允许流式传输,否则浏览器会等全部内容加载完才显示。

2. 浏览器兼容性问题

  • ReadableStreamTextDecoderStream 在新浏览器中支持良好
  • SSE 不支持 IE
  • WebSocket 跨域需特别配置

3. 网络中断/重连机制

  • SSE 自带断线重连机制
  • WebSocket 需手动处理重连逻辑

九、延伸:结合前端框架(Vue/React)

以 Vue 为例:

<template><pre>{{ content }}</pre>
</template><script setup>
import { ref, onMounted } from 'vue'const content = ref('')onMounted(async () => {const response = await fetch('/stream');const reader = response.body.getReader();const decoder = new TextDecoder();while (true) {const { done, value } = await reader.read();if (done) break;content.value += decoder.decode(value);}
});
</script>

十、总结

技术单向/双向控制能力浏览器支持用例
Fetch Stream单向新版浏览器AI回答、实时日志等
EventSource单向较好(除IE)消息推送、状态通知
WebSocket双向聊天、游戏、协同编辑
TransformStream单向很强较新浏览器分段解析、关键词处理等

相关文章:

前端流式接收数据讲解

前端流式接收数据全面讲解 前端流式接收数据&#xff08;Streaming Data Reception&#xff09;是现代 Web 应用中一个重要特性&#xff0c;尤其在处理实时通信、大文件传输、聊天、视频播放、实时日志监控等场景下。下面我们从概念到技术实现&#xff0c;再到应用示例&#x…...

Flutter下的一点实践

目录 1、背景2、refena创世纪代码3、localsend里refena的刷新3.1 初始状态3.2 发起设备扫描流程3.3 扫描过程3.3 刷新界面 4.localsend的设备扫描流程4.1 UDP广播设备注册流程4.2 TCP/HTTP设备注册流程4.3 localsend的服务器初始化工作4.4总结 1、背景 在很久以前&#xff0c;…...

Python训练营打卡 Day41

简单CNN 知识回顾 数据增强卷积神经网络定义的写法batch归一化&#xff1a;调整一个批次的分布&#xff0c;常用与图像数据特征图&#xff1a;只有卷积操作输出的才叫特征图调度器&#xff1a;直接修改基础学习率 卷积操作常见流程如下&#xff1a; 1. 输入 → 卷积层 → Batch…...

Eclipse集成lombok

一、安装 Lombok 插件&#xff08;Eclipse 支持&#xff09; 下载 lombok.jar&#xff1a; 前往官网下载页面&#xff1a;https://projectlombok.org/download 下载最新版本的 lombok.jar 文件。 运行 lombok.jar 配置 Eclipse&#xff1a; 双击下载的 lombok.jar&#xff0…...

什么是trace,分布式链路追踪(Distributed Tracing)

在你提到的 “个人免费版” 套餐中&#xff0c;“Trace 上报量&#xff1a;5 万条 / 月&#xff0c;存储 3 天” 里的 Trace 仍然是指 分布式链路追踪记录&#xff0c;但需要结合具体产品的场景来理解其含义和限制。以下是更贴近个人用户使用场景的解释&#xff1a; 一、这里的…...

VScode ios 模拟器安装cocoapods

使用 Homebrew 安装&#xff08;推荐&#xff09; 如果你有 Homebrew&#xff0c;直接用它安装更稳定&#xff1a; brew install cocoapods...

Redis最佳实践——安全与稳定性保障之数据持久化详解

Redis 在电商应用的安全与稳定性保障之数据持久化全面详解 一、持久化机制深度解析 1. 持久化策略矩阵 策略触发方式数据完整性恢复速度适用场景RDB定时快照分钟级快容灾备份/快速恢复AOF实时追加日志秒级慢金融交易/订单关键操作混合模式RDBAOF同时启用秒级中等高安全要求场…...

互联网大厂Java求职面试实战:Spring Boot微服务架构及Kafka消息处理示例解析

互联网大厂Java求职面试实战&#xff1a;Spring Boot微服务架构及Kafka消息处理示例解析 引言 在互联网大厂的Java开发岗位面试中&#xff0c;考察候选人对微服务架构设计、消息队列处理及高并发处理能力是重点。本文结合Spring Boot框架和Kafka消息队列&#xff0c;模拟一个…...

K 值选对,准确率翻倍:KNN 算法调参的黄金法则

目录 一、背景介绍 二、KNN 算法原理 2.1 核心思想 2.2 距离度量方法 2.3 算法流程 2.4算法结构&#xff1a; 三、KNN 算法代码实现 3.1 基于 Scikit-learn 的简单实现 3.2 手动实现 KNN&#xff08;自定义代码&#xff09; 四、K 值选择与可视化分析 4.1 K 值对分类…...

技术栈ES的介绍和使用

目录 1. 全文搜索引擎&#xff08;Elastic Search&#xff09;的由来2. Elastic Search 概述2.1 Elastic Search 介绍2.2 Elastic Search 功能2.3 Elastic Search 特点 3. 安装 Elastic Search3.1 ES 的安装3.2 安装 kibana3.3 ES 客户端的安装 4. Elastic Search 基本概念4.1 …...

跟Gemini学做PPT-模板样式的下载

好的&#xff0c;这里有一些推荐的网站&#xff0c;您可以在上面找到PPT目录样式和模板的灵感&#xff1a; SlideModel (slidemodel.com) 提供各种预先设计的目录幻灯片模板。这些模板100%可编辑&#xff0c;可用于PowerPoint和Google Slides。您可以找到不同项目数量&#xff…...

Windows版本的postgres安装插件http

1、下载安装包 这里使用安装 pgsql-http 的扩展 源码地址&#xff1a;GitHub - pramsey/pgsql-http: HTTP client for PostgreSQL, retrieve a web page from inside the database. 编译的安装地址&#xff1a;http extension for windows updated to include PostgreSQL17 …...

uni-app学习笔记十六-vue3页面生命周期(三)

uni-app官方文档页面生命周期部分位于页面 | uni-app官网。 本篇再介绍2个生命周期 1.onUnload&#xff1a;用于监听页面卸载。 当页面被关闭时&#xff0c;即页面的缓存被清掉时触发加载onUnload函数。 例如:在demo6页面点击跳转到demo4&#xff0c;在demo4页面回退不了到d…...

优化的两极:凸优化与非凸优化的理论、应用与挑战

在机器学习、工程设计、经济决策等众多领域&#xff0c;优化问题无处不在。而在优化理论的世界里&#xff0c;凸优化与非凸优化如同两个截然不同的 “王国”&#xff0c;各自有着独特的规则、挑战和应用场景。今天&#xff0c;就让我们深入探索这两个优化领域的核心差异、算法特…...

(五)MMA(OpenTelemetry/Rabbit MQ/ApiGateway/MongoDB)

文章目录 项目地址一、OpenTelemetry1.1 配置OpenTelemetry1. 服务添加2. 添加服务标识3. 添加请求的标识4. 添加中间价 二、Rabbit MQ2.1 配置Rabbit MQ1. docker-compose2. 添加Rabbit MQ的Connect String 2.2 替换成Rabbit MQ1. 安装所需要的包2. 使用 三、API Gateways3.1 …...

TCP通信与MQTT协议的关系

1. MQTT 处理核心&#xff08;Mqtt_Pro&#xff09; void Mqtt_Pro(void) { MQTT_Init(); // 初始化MQTT协议栈&#xff08;连接参数、缓冲区等&#xff09; MQTT_SendPro(); // 处理MQTT发送&#xff08;封装消息&#xff0c;调用TCP发送&#xff09; MQTT_RecPro();…...

AWS创建github相关的角色

创建github-actions角色 {"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": {"Federated": "arn:aws:iam::11111111:oidc-provider/token.actions.githubusercontent.com…...

数据编辑器所具备的数据整理功能​

在企业的数据处理过程中&#xff0c;数据清洗与整理是至关重要的环节&#xff0c;而数据编辑器在这方面发挥着关键作用。在一份包含客户信息的数据表中&#xff0c;常常会出现缺失值的情况。比如客户的年龄、联系方式等字段可能因为各种原因没有被记录&#xff0c;这就形成了缺…...

Unity网络开发实践项目

摘要&#xff1a;该网络通信系统基于Unity实现&#xff0c;包含以下几个核心模块&#xff1a; 协议配置&#xff1a;通过XML定义枚举&#xff08;如玩家/英雄类型&#xff09;、数据结构&#xff08;如PlayerData&#xff09;及消息协议&#xff08;如PlayerMsg&#xff09;&a…...

Jetson Orin Nano - SONY imx415 camera驱动开发

目录 前言: 调试准备工作: 修改内核默认打印等级 一、imx415驱动开发 1、硬件接线 2、设备树修改 2.1 创建 tegra234-p3767-camera-p3768-imx415-C-4lane.dtsi 文件 2.2 tegra234-p3767-camera-p3768-imx415-C-4lane.dtsi 添加到设备树 2.3 编译设备树 3、imx415驱动…...

word为跨页表格新加表头和表名

问题&#xff1a; 当表格过长需要跨页时&#xff08;如下图所示&#xff09;&#xff0c;某些格式要求需要转页接排加续表。 方法一&#xff1a; 1、选中表格&#xff0c;在“表布局”区域点开“自动调整”&#xff0c;选择“固定列宽”&#xff08;防止后续拆分表格后表格变…...

测试用例篇章

本节概要&#xff1a; 测试⽤例的概念 设计测试⽤例的万能思路 设计测试⽤例的⽅法 一、测试用例 1.1 概念 什么是测试用例&#xff1f; 测试⽤例&#xff08;Test Case&#xff09;是为了实施测试⽽向被测试的系统提供的⼀组集合&#xff0c;这组集合包含&#xff1a;测…...

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析 一、流量分析 题目没有任何提示,附件gzl.pcap 解题哥斯拉流量300多KB包很多,没啥经验只能挨个看回来之后又狠狠得撸了一把哥斯拉流量分析我这里用的是哥斯拉4.0.1 测试链接…...

Django ToDoWeb 服务

我们的任务是使用 Django 创建一个简单的 ToDo 应用程序,允许用户添加、查看和删除笔记。我们将通过设置 Django 项目、创建 Todo 模型、设计表单和视图来处理用户输入以及创建模板来显示任务来构建它。我们将逐步实现核心功能以有效地管理 todo 项。 Django ToDoWeb 服务 …...

【软件】在 macOS 上安装 Postman

在 macOS 上安装 Postman 是一个简单的过程&#xff0c;以下是详细的步骤&#xff1a; 一、下载 Postman • 访问 Postman 官方网站&#xff1a; 打开浏览器&#xff0c;访问Postman 官方下载页面。 • 下载安装包&#xff1a; 页面会自动识别你的系统&#xff0c;点击“Dow…...

各种数据库,行式、列式、文档型、KV、时序、向量、图究竟怎么选?

慕然回首&#xff0c;发现这些年来涌现出了许多类型的数据库&#xff0c;今天抽空简单回顾一下&#xff0c;以便于后面用到时能快速选择。 1. 关系型数据库(行式) 关系型数据库&#xff08;RDBMS&#xff09;&#xff0c;我们常说的数据库就是指的关系型数据库。 它的全称是关…...

全志科技携飞凌嵌入式T527核心板亮相OpenHarmony开发者大会

近日&#xff0c;OpenHarmony开发者大会2025&#xff08;OHDC.2025&#xff0c;以下简称“大会”&#xff09;在深圳举办&#xff0c;全志科技作为OpenHarmony生态的重要合作伙伴受邀参会&#xff0c;并进行了《全志科技行业智能芯片OpenHarmony方案适配与认证经验分享》的主题…...

AI+微信小程序:智能客服、个性化推荐等场景的落地实践

在移动互联网流量红利逐渐见顶的今天,微信小程序凭借“即用即走”的轻量化特性,已成为企业连接用户的核心阵地。而AI技术的融入,正让小程序从工具型应用进化为“懂用户、会思考”的智能服务终端。本文将结合实际案例,解析AI在微信小程序中的两大核心场景——智能客服与个性…...

事件驱动架构入门

主要参考资料&#xff1a; 软件架构-事件驱动架构: https://blog.csdn.net/liuxinghao/article/details/113923639 目录 简介事件队列事件日志事件收集器响应队列读事件 vs. 写事件 简介 事件驱动架构是一种系统或组件之间通过发送事件和响应事件彼此交互的架构风格。当某个事…...

基于Web的濒危野生动物保护信息管理系统设计(源码+定制+开发)濒危野生动物监测与保护平台开发 面向公众参与的野生动物保护与预警信息系统

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...