SSE接口的几种实现方式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

我会在本章介绍SSE接口的几种实现方式,包括webflux和spring mvc,以及使用几种方法调用sse接口的方法。


一、sse是什么?

SSE 接口" 通常指的是 Server-Sent Events(SSE)接口。Server-Sent Events 是一种用于在客户端和服务器之间实现单向实时通信的 web 技术。它允许服务器向客户端推送事件,而客户端通过简单的 JavaScript 代码监听这些事件。

SSE 主要用于实现服务器向客户端的实时更新,例如推送新闻、实时股票报价、即时通讯等场景。与其他实时通信技术(如 WebSocket)相比,SSE 是一种简单的、基于 HTTP 的轻量级解决方案,适用于一些场景下不需要双向通信的应用。

二、webFlux和Spring MVC

1. 响应式编程模型:

WebFlux:

WebFlux 是基于响应式编程模型的框架,支持反应式流和非阻塞 I/O。

使用 Flux 或 Mono 类型来表示 SSE 数据流。

Spring MVC:

Spring MVC 是传统的 Servlet 模型,采用同步阻塞的方式处理请求和响应。

在 Spring MVC 中,使用 SseEmitter 类来处理 SSE 数据流。

2. 数据流类型:

WebFlux:

使用 Flux 或 Mono 类型,其中 ServerSentEvent 对象包装 SSE 数据。

适用于响应式、非阻塞的场景。

Spring MVC:

使用 SseEmitter 类,可以发送任意类型的数据,不仅仅是 ServerSentEvent。

SseEmitter 提供更大的灵活性,可以发送任何类型的数据。

3. 框架整合:

WebFlux:

WebFlux 与整个响应式编程框架集成,更适用于构建响应式、非阻塞的应用程序。

Spring MVC:

Spring MVC

传统的 Servlet 模型,适用于同步处理请求的应用程序。

4. 代码示例:

使用 WebFlux 处理 SSE:
java 复制代码
@RestController
@RequestMapping("/api")
public class SSEController {

    @GetMapping("/stream")
    public Flux<ServerSentEvent<String>> handleStream() {
        return Flux.interval(Duration.ofSeconds(1))
                .map(index -> ServerSentEvent.builder("Data: " + index).build());
    }
}
Spring MVC 处理 SSE::
java 复制代码
@RestController
@RequestMapping("/api")
public class SSEController {

    @GetMapping("/stream")
    public SseEmitter handleStream() {
        SseEmitter emitter = new SseEmitter();
        // 设置 SSEEmitter 的处理逻辑
        // ...
         emitter.send(data);
        return emitter;
    }
}

三.webflux和okhttp调用sse的区别

webflux

c 复制代码
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;

public class WebClientSSEExample {

    public static void main(String[] args) {
        WebClient webClient = WebClient.create("http://your-server");

        Flux<String> sseFlux = webClient.get()
                .uri("/api/stream")
                .retrieve()
                .bodyToFlux(String.class);

        sseFlux.subscribe(eventData -> {
            System.out.println("Received Event: " + eventData);
        });
    }
}

okhttp

java 复制代码
import okhttp3.*;
import okhttp3.Request.Builder;
import okhttp3.Response;
import okhttp3.sse.EventSource;
import okhttp3.sse.EventSourceListener;

public class OkHttpSSEExample {

    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();

        Request request = new Builder().url("http://your-server/api/stream").build();

        EventSourceListener listener = new EventSourceListener() {
            @Override
            public void onEvent(String id, String type, String data) {
                System.out.println("Received Event: " + data);
            }

            @Override
            public void onFailure(Exception e, Response response) {
                e.printStackTrace();
            }
        };

        EventSource eventSource = new EventSource(request, listener);
        eventSource.start();
    }
}

四.同步获取完整完整数据

c 复制代码
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;

public class WebClientSSEExample {

    public static void main(String[] args) {
        WebClient webClient = WebClient.create("http://your-server");

        Flux<String> sseFlux = webClient.get()
                .uri("/api/stream")
                .retrieve()
                .bodyToFlux(String.class);
		String last = sseFlux.blockLast();
    }
}

相关推荐
leikooo8 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
Ivanqhz10 小时前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
沙漠之主10 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
FPGA小徐10 小时前
PA1 基础设施(2)深度解析:NEMU 中 ITRACE、MTRACE、FTRACE、IRINGBUF、ETRACE、DIFFTEST 全解析
java·服务器·网络
YOLO数据集集合11 小时前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化
知行EDI11 小时前
知行之桥 MaBang 端口使用指南——Create Order 订单创建篇
java·服务器·数据库
笑鸿的学习笔记11 小时前
C++笔记之大块顺序写
java·c++·笔记
打工仔折腾 AI11 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战
殷色玫瑰12 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·linux·c语言·c++
code_slave(码畜)12 小时前
微服务架构落地:基础服务 —— 报表服务(中篇:元数据、查询引擎、缓存与权限落地)
spring boot·spring cloud·缓存·微服务·架构