流式数据服务端怎么传给前端,前端怎么接收?

前端接收流式数据的完整方案(SSE/WebSocket/Fetch API) 上面这些方案可以实现: ✅ 实时聊天应用。✅ AI生成内容流式展示。 阅读详情

01 引言

大模型时代,尤其会话模型为了提高用户的使用体验,它不会将所有的数据加载完成一次响应给客户端,而是通过数据流,一点点的将数据慢慢呈现出来。

正是这种有趣的交互方式一次次将SSE(Server Sent Event)技术推到大众视野。之前的文章已经介绍过SSE推送技术以及SSE替代WebSocket实现直播间实时评论功能的文章,这里就不在赘述。

恰巧,有位粉丝朋友咨询怎么讲流式数据传给前端,前端怎么接收?小编为此做了相关的测试,整理在这里,分享给大家。

02 思维定式

我们经常编写的是一次请求,一次响应这样标准的http请求。如:

@RestController
public class FooController {
    
    @GetMapping("/foo")
    public String foo() {
        return "success";
    }
}

而流式数据该怎么处理呢?一次请求,有源源不断的数据加载进来。如果按照思维定式处理,只能能到所有的数据全部加载完成,再响应给前端。这样带来的结果有:

  • 响应时间过长,体验感很差
  • 响应超时,前端无法获取到数据

流式数据返回在响应式编程里面非常普遍,如reactor.core.publisher.Flux、io.reactivex.Flowable等。我们姑且以Flux和Flowable作为案例测试。

03 流式响应

3.1 Flux<T>

Flux是spring-boot-starter-webflux管理下的reactor-core.jar包。具体的Maven:

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

案例

@GetMapping("/stream")
public Flux<String> streamData() {
    return Flux.interval(Duration.ofSeconds(1)).map(sequence -> {
         // 为了方便:拼接随机数方便观察
        String a = "flux_data: " + sequence + ":" +new Random().nextFloat();
        System.out.println(a);
        return a;
    });
}

浏览器直接访问

我们可以看到正常的Http请求,只有等到所有的流数据处理完成之后才会一起展示出来。

3.2 Flowable<T>

Flowable是位于rxjava.jar包下。具体的Maven:

<dependency>
    <groupId>io.reactivex.rxjava2</groupId>
    <artifactId>rxjava</artifactId>
    <version>2.2.21</version>
</dependency>

案例

@GetMapping("/flowable")
public Flowable<String> flowable() {
    // 每隔一秒发送一条数据
    return Flowable.interval(1, TimeUnit.SECONDS).map(item -> {
        // 为了方便观察,增加随机数
        String data ="flowable_test:"+ item + "_" + new Random().nextFloat();
        System.out.println(data);
        return data;
    });
}

浏览器直接访问

断开服务器

3.3 前端接收

上面的案例均使用了浏览器直接访问,类似使用了ajax、fetch等请求。我们以fetch为例:

$("button[name='send']").click(function (){
    fetch("/stream")
        .then(resp => resp.text())
        .then(data => console.info(data));
});

结果

第一张图中并没有打印数据,而是等全部流数据完成之后才会打印展示。前端处理的话,同样等到数据处理完成才能渲染。

这种常规的请求已然不能满足我们的业务场景了。只能请出我们的大杀器SSE了。

04 前端处理流式请求

关于SSE这里不多介绍,详细可以看详细文档说明:https://javascript.info/server-sent-events

4.1 前端直接处理流式数据

服务端只要返回流式数据即可,如Flux<T>、Flowable<T>等。为了方便演示,我们通过按钮出发接收流式数据。服务端和上面的案例相同。

JS代码

$("button[name='send']").click(function (){
    let eventSource = new EventSource("/stream");
    eventSource.onmessage = function (event) {
        console.log("数据打印:" + event.data);
    }
});

结果

我们可以看到数据是一条一条返回给前端的。

4.2 服务端推数据给前端

不使用响应式编程的情况下,如何将数据逐步推给前端呢?那就通过org.springframework.web.servlet.mvc.method.annotation.SseEmitter,手动推送给前端。

前端的JS代码只需要订阅指定的路径,然后监听消息即可。写法同4.1。

JS代码

$("button[name='send']").click(function (){
    let eventSource = new EventSource("/subscription");
    eventSource.onmessage = function (event) {
        console.log("数据打印:" + event.data);
    }
});

服务端

SseEmitter sseEmitter;

@GetMapping("/subscription")
public SseEmitter sseEmitter() {
    sseEmitter = new SseEmitter();
    return sseEmitter;
}

@PostConstruct
public void timer() {
    new Timer().schedule(new TimerTask() {
        @Override
        public void run() {
            if (sseEmitter != null) {
                try {
                    sseEmitter.send("sseEmitter_" + new Random().nextFloat());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }, 1000, 1000);
}

通过/subscription订阅,并生成对应的客户端。服务端推送消息,都是通过这个客户端推送的。timer()定时器模拟数据自动推送。

我们直接看前端的效果:

当然我们对接业务中需要考虑连接超时的问题,以及页面多开客户端区分的问题。这部分内容可以参考之前的文档:SSE 推送技术

05 小结

流式数据对于大数据量的处理展示比较常见,包括Mybaits也支持流式查询,防止频繁的数据库连接池的打开和关闭。流式处理一般都是长连接,长连接势必带来资源的占用。用不好,可能造成连接池沾满、内存溢出等意想不到的问题。

WebVtk技术解析:vtk.js与vtkWeb选型指南与三维可视化实践 三维可视化是科学计算、医学影像和工程仿真等领域数据呈现的核心技术,其原理在于将复杂数据转换为直观的图形图像。VTK(Visualization Toolkit)作为该领域的经典开源库,以其强大的数据处理和渲染管线架构而闻名。随着Web技术的发展,将VTK能力迁移至浏览器成为关键需求,这催生了WebVtk技术方案,其价值在于实现无需安装、跨平台的三维交互可视化。在应用场景上,根据数据规模与计算需求,主要分为纯前端渲染的vtk.js和前后端分离的vtkWeb两条技术路线。vtk.js适用于数据量较小、需快速部署 阅读详情

相关推荐

docker安装的 n8n提示Your n8n server is configured to use a secure cookie, however you are either visiting

将原来的docker n8n进行删除后即可通过一下方式重新安装,如安装完n8n,提示。

满地找牙的博客 3366

前端如何接受流式数据(SSE)

前言:最近需要对接一个AI大模型,后端使用SSE流式传输,要求前端实现打字机效果,即一个字一个字显示的效果,记录一下解决方法。首先的想法是使用浏览器原生的SSE接口,可以自动解析流式数据的事件名,数据等,但是EventSource构造函数。参数,因为流式传输时,一个汉字/emoji符号会被拆成多个码点,可能正好不在同一块数据中,接受header配置,如果token是放在header中的,就不能使用这个方式。,因为默认的xhr适配器不支持stream,然后在。如果想使用axios,需要在。

osmanthuspeace的博客 2805

手把手教你用Python分析OpenFAST仿真结果:pyDatView处理.out文件与数据可视化技巧

本文详细介绍了如何使用Python中的pyDatView工具分析OpenFAST仿真结果,包括数据加载、质量检查、时域与频域分析、多工况对比及自动化报告生成。通过优化技巧和可视化方法,帮助工程师高效处理.out文件,提升风机性能分析的准确性和效率。

weixin_29311017的博客 184

前端获取流式数据

正常http交互后端返回大量数据,前端需要接口拿到所有的响应体才能操作数据,这个时候就用到了数据流,后端返回一块数据拿一块数据(服务器也需要流式输出),可以极大的减少等待时间。

weixin_60211841的博客 2007

来自工业界的知识库 RAG 服务(二),RagFlow 源码全流程深度解析

前面介绍过有道 QAnything 源码解析,通过深入了解工业界的知识库 RAG 服务,得到了不少调优 RAG 服务的新想法。因此本次趁热打铁,额外花费一点时间,深入研究了另一个火热的开源 RAG 服务RagFlow的完整实现流程,希望同样有所收获。首先依旧可以先从框架图入手,与常规的 RAG 架构进行一些比较可以看到右侧知识库被明显放大,同时最右侧详细介绍了文件解析的各种手段,比如OCR等,这些在常规的 RAG 中可能会作为一个不起眼的。

易迟的专栏 2万+

基恩士PLC编程避坑指南:局部变量@前缀的3个隐藏陷阱与实战解决方案

本文深入剖析了基恩士PLC编程中使用@前缀创建局部变量的三大隐藏陷阱,包括在线调试时的数据丢失、数据类型冲突以及子程序复用时的地址覆盖问题。针对每个陷阱,提供了预定义变量、强类型规范和基址参数传递等实战解决方案,帮助中高级工程师提升代码健壮性与可维护性。

weixin_29171087的博客 103

前端流式接收数据讲解

传统方式:前端发起请求,后端准备好完整数据后一次性返回。流式方式:后端逐步返回数据片段(chunk),前端逐块接收和处理,实现边接收边处理。技术单向/双向控制能力浏览器支持用例单向强新版浏览器AI回答、实时日志等单向中较好(除IE)消息推送、状态通知WebSocket双向强好聊天、游戏、协同编辑单向很强较新浏览器分段解析、关键词处理等。

HGX-DJK 2730

群晖设置公网ipv6方式域名解析访问

群晖、IPV6、域名解析

爬山虎的博客 2万+

Stream流式通过Ngnix代理转发和简单前端接收流式数据的示例

nginx支持TCP和UDP协议的Stream模块,允许对流式数据进行代理转发、负载均衡和协议转换。要配置nginx Stream模块代理转发流式数据,可以按照以下步骤操作: 1. 在nginx配置文件中添加Stream模块的配置块。需要注意的是,对于不同的流式数据协议,还需要根据其具体协议特点进行额外的配置,以确保正确的代理转发。当有客户端连接到WebSocket服务器时,服务器将开始以每秒钟一次的频率向客户端发送生成的随机数,并将其包装在。的HTML元素中,并在每次收到新数据时添加到已有数据的末尾。

人工智能全栈工程师 | 智能算法研发与实战落地​专注于人工智能算法研究、代码实现与工程落地,提供从模型设计到部署应用的全流程解决方案。 4016

基于GEC6818开发板的C/C++贪吃蛇小游戏

f.开始游戏(进入游戏,并没有马上开游戏,需要点击播放才能开始)2.相关宏,全局变量(可以根据自己需要进行修改)k.显示文字前的相关初始化。k.自定义font.h文件。1.需要的主要头文件。l.在开发板上显示字1。m.在开发板上显示字2。a.显示固定大小图片。h.线程1:获得坐标。

2301_77273301的博客 2133

高通GAIA V3命令参考手册的研读学习(15):自定制命令的详细工作描述

里的示例一样,手机APP发出这个GetManuFacturer的命令发0x0000,那么耳机回复:0x8000, 同时在回复的playload部分,用最多15个字节的ACSII码来表达制造商信息(因此最多15个字母)。那么这个APP在通过GAIA协议控制这个耳机时,不仅可以通过前面讲过的vendor ID来识别,也可以更进一步通过这个命令来识别这个耳机,到底是不是本公司的。通过这个可变长度的playload,真的是可以传达极多的事先约定的信息,相当的灵活,真是不错!这个命令用来得到设备的制造商信息。

qq_37191547的博客 400

MCP协议详解:AI模型如何安全可靠调用外部数据服务

在大模型应用落地过程中,'模型无法真实访问外部数据'已成为核心瓶颈。MCP(Model Context Protocol)作为一种面向生产环境的标准化上下文交互协议,通过定义结构化工具规范、可验证请求响应格式与上下文协调机制,解决了AI系统与现实世界服务之间的语义鸿沟与工程耦合问题。其本质是将传统API调用升级为具备意图理解、安全管控和可追溯性的智能协作范式,显著提升多源数据融合、审计合规与动态工作流编排能力。本文深入解析MCP三大核心组件及其在金融、专利、供应链等典型场景中的工程实践。

weixin_34327761的博客 445

uniapp [全端兼容] - 实现人脸识别对比+人脸相似度,从相册选择或拍照上传两张图片进行人脸对比得到人脸相似度及判断是否是同一个人,人脸活体检测及对比(免费纯前端方案+调用第三方API接口方案)

uniApp人脸对比 人脸对比识别 人脸对比相似度,uniapp实现获取手机摄像头权限,调用相机拍照实现人脸识别相似度对比,uniapp实现人脸识别对比,计算两张人脸的相似度,从而判断是否同一个人,并给出相似度评分。uniapp H5网页如何实现人脸相似度比对,uniapp纯前端怎么对比两张图片的相似度,计算两幅图像的相似度,图像相似度对比方法,UNI-APP人脸相似度对比,快速识别两张照片的相似程度(用百分比)图片相似度对比在线测试,图片相似度对比,uniapp微信小程序人脸相似度对比分析,uniapp

🏆 前端领域优质创作者 5021

WCF服务中安全可序列化的数据库查询方案

在分布式服务架构中,跨进程查询意图的建模与传输是核心挑战之一。WCF作为成熟的企业级通信框架,其DataContract序列化机制要求所有传输对象必须为纯数据契约、支持类型白名单与强约束校验。本文聚焦于将LINQ风格的分页、排序、条件筛选等查询能力,安全落地到WCF服务层——通过定义可序列化的Criteria元数据模型,替代不可跨边界传递的IQueryable和Expression树,实现查询意图的声明式描述、服务端可验证解析与多ORM适配。该方案天然防御SQL注入,兼容EF Core、Dapper及原生A

diaozhiwa5526的博客 339

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

前端fetch流式数据接收

使用 Fetch API 发送请求并通过 ReadableStream 接收流式响应,实现 AI 回答的实时渲染效果。通过 TextDecoder 解码响应流并逐步更新界面。

2302_78685420的博客 841

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

前端大模型入门:流式调用llm时前端该如何处理响应数据?

调用大模型时,使用流式响应往往能够更快获得响应数据,但处理方式相对会复杂一些,本文将会教你如何从响应流中提取出数据。

分享有趣的、贴近生活的CS知识 4332

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

JavaScript前端接收流式数据

在Java开发中,前端接收流式数据通常涉及到使用WebSocket 或Server-Sent Events(SSE)这样的技术。在前端,你可以使用JavaScript的WebSocket API来建立WebSocket连接,并通过监听事件来接收流式数据。在前端,你可以使用JavaScript的EventSource API来接收SSE数据。除了原生的WebSocket和SSE,你还可以考虑使用一些现代的前端框架或库,如。在选择适合你项目的方案时,考虑到你的实际需求和项目架构,以及浏览器的兼容性。

斯黄人民的博客 2489

前端使用 fetch 接收流式数据处理

前端使用fetch进行流式数据处理

xiaoliyo_的博客 1952

前端如何接收SSE流式数据传输(大模型网站常用)

参考:https://blog.youkuaiyun.com/qq_43750656/article/details/1315911984。使用fetchEventSource。

rolling_kitten的博客 3082

[Front-end] 接收流数据(Stream Data), 并处理数据(AI Chat 场景)

现在IT技术行业最热门的讨论点当属AI了, 每个公司都希望可以快速、正确的使用AI。在AI 整体的实用中,AI机器人及其实现又是所有场景中使用最为广泛的。 如何快速的实现一个有打字机效果的web application, 这段时间一直都很热门。 这里自己记录一下手动实现一个有打字机效果的机器人项目中实现的打字机效果的API对接方式。

Alice Dong的技术总结博客 1612

AI菜鸟向前飞 — LLM简介

AI菜鸟向前飞 — LLM简介

2401_82469710的博客 2577

如何在服务器端接收流式stream数据

ChatGPT:在服务端接收流式stream的具体实现方式可能会因不同的编程语言和框架而有所不同,但一般而言,可以按照以下步骤实现: 1. 在服务端创建一个监听端口,并等待客户端连接。需要注意的是,在接收流式stream的过程中,服务端应该及时处理数据,以避免缓存区溢出。然后,在服务器块中,我们定义Nginx将在该端口上侦听的服务,并通过proxy_pass命令将Stream数据流转发到上游块“my_stream_backend”。然后,接收客户端的流对象,并将流数据转发到另一个服务端或客户端。

人工智能全栈工程师 | 智能算法研发与实战落地​专注于人工智能算法研究、代码实现与工程落地,提供从模型设计到部署应用的全流程解决方案。 2820

前端接受后端文件流并下载的几种方法

项目中经常会遇到需要导出列表内容,或者下载文件之类的需求。结合各种情况,我总结了前端最常用的三种方法来接受后端传过来的文件流并下载,针对不同的情况可以使用不同的方法。 首先是后端将文件转换成byte数组 /** * 将文件转换成byte数组 * @param filePath 文件File类 通过new File(文件路径) * @return byte数组 */ public static byte[] File2byte(File filePath).

qq_42957435的博客 1万+

前端接收流式数据demo,并用markdown解析数据,包括EventSource和fetch两种方式

前端接收流式数据demo,并用markdown解析数据,包括EventSource和fetch两种方式

qq_41822157的博客 1041
上一篇: 深入理解HanLP1.x,填平可能遇到的坑
下一篇: 手搓MCP客户端动态调用多MCP服务,调用哪个你说了算!
智_永无止境
博客等级 码龄10年 803粉丝 406原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值