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

server向浏览器发送信息-SseEmitter使用

什么是SseEmitter

SseEmitter 是 Spring 框架中的一个类,用于支持服务器发送事件(Server-Sent Events, SSE)。SSE 是一种允许服务器主动向客户端推送实时更新的技术,通常用于需要实时数据更新的应用场景,如股票行情、社交媒体通知等。

在 Spring 中,SseEmitter 提供了一种简单的方式来实现 SSE。通过 SseEmitter,服务器可以在一个长连接中不断地向客户端发送事件,而客户端则可以通过 JavaScript 的 EventSource 对象来接收这些事件

和websocket的区别

SseEmitter(Server-Sent Events)和 WebSocket 是两种不同的技术,用于在客户端和服务器之间进行实时通信。它们有各自的特点和适用场景。

  1. SseEmitter(Server-Sent Events,SSE)

    • 单向通信:SSE 是一种单向通信协议,服务器可以向客户端发送更新,但客户端不能向服务器发送数据。
    • 基于HTTP:SSE 使用 HTTP 协议,客户端通过 HTTP 请求订阅服务器的事件流,服务器通过持续的 HTTP 响应发送事件。
    • 简单实现:SSE 的实现相对简单,特别适合于需要从服务器向客户端推送实时更新的场景,如股票行情、新闻推送等。
    • 浏览器支持:大多数现代浏览器都支持 SSE,但在某些旧版本的浏览器中可能不支持。
  2. WebSocket

    • 双向通信:WebSocket 是一种全双工通信协议,允许客户端和服务器之间进行双向数据传输。
    • 独立协议:WebSocket 是一个独立的协议,虽然最初的握手是通过 HTTP 完成的,但一旦连接建立,通信就不再依赖于 HTTP。
    • 高效传输:WebSocket 连接一旦建立,数据传输效率高,适合需要频繁、低延迟通信的场景,如在线游戏、实时聊天应用等。
    • 复杂实现:WebSocket 的实现相对复杂,需要处理连接的建立、维护和关闭等细节。

总结

  • 如果你的应用场景只需要服务器向客户端推送数据,并且实现简单是一个重要考虑因素,那么可以选择 SseEmitter(SSE)。
  • 如果你的应用场景需要双向实时通信,并且对传输效率和低延迟有较高要求,那么 WebSocket 是更好的选择。

代码示例

 

import org.springframework.web.bind.annotation.*;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/chat")
public class ChatController {

    private List<SseEmitter> emitters = new ArrayList<>();
    //发送
    @PostMapping("/send")
    public void sendMessage(@RequestBody ChatMessage message) {
        for (SseEmitter emitter : emitters) {
            try {
                emitter.send(message, MediaType.APPLICATION_JSON);
            } catch (IOException e) {
                emitter.completeWithError(e);
            }
        }
    }
    
    //接收
    @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public SseEmitter streamMessages() {
        SseEmitter emitter = new SseEmitter(60000L); //超时时间
        emitters.add(emitter);
        emitter.onCompletion(() -> emitters.remove(emitter));
        emitter.onTimeout(() -> emitters.remove(emitter));
        return emitter;
    }
}

//信息体
@Data
public class ChatMessage {
    private String sender;
    private String content;
    private String timestamp;

    // Getters and Setters
}

/chat/stream 接收到的消息 

 


http://www.kler.cn/a/411110.html

相关文章:

  • Linux—进程概念学习-03
  • 【GAMES101笔记速查——Lecture 19 Cameras,Lenses and Light Fields】
  • 【算法】连通块问题(C/C++)
  • Github 2024-11-26 Python开源项目日报Top10
  • 【自适应和反应式机器人控制】编程练习 1.1:计算最优轨迹 + 编程练习 1.3:基于三阶多项式的闭式时变轨迹发生器
  • 【华为】配置VXLAN构建虚拟网络实现相同网段互通(静态方式)
  • 【第三方云音乐播放器SPlayer本地安装结合内网穿透打造个性化远程音乐库】
  • Rust赋能前端: 纯血前端将 Table 导出 Excel
  • 【算法】欧几里得与拓展欧几里得算法
  • 算法笔记:滑动窗口
  • 从Full-Text Search全文检索到RAG检索增强
  • 【python】数据可视化之图像处理
  • TailwindCss 总结
  • 【纪念365天】我的创作纪念日
  • CDAF / PDAF 原理 | PDAF、CDAF 和 LAAF 对比 | 图像清晰度评价指标
  • 【Linux系统】—— 基本指令(四)
  • Kotlin DSL Gradle 指南
  • MYSQL 表的增删改查(上)
  • qt ubuntu i386 系统
  • 【MySQL系列】通过创建新表备份`password`字段
  • c++:面向对象三大特性--继承
  • 数据结构 【二叉树(上)】
  • c++学习:json库例子
  • Spark SQL大数据分析快速上手-Hive安装
  • 【设计模式】【行为型模式(Behavioral Patterns)】之命令模式(Command Pattern)
  • Vue进阶面试题(三)