初探Server-Sent Events (SSE):实现后端消息推送到前端

1、简介

在现代Web应用中,实时数据交互成为了提升用户体验的关键一环。WebSocket无疑是实现这一需求的明星技术,但当场景仅需服务端向客户端单向推送时,Server-Sent Events (SSE) 提供了一个更轻量级的选择。常用在数据大屏请求服务端,在数据大屏中很少出现大屏向服务端发送数据。

2、SSE vs WebSocket:核心差异

WebSocket提供全双工通道,即客户端与服务端可自由互发消息,适用于需要频繁、低延迟交互的场景,如在线聊天。然而,WebSocket引入了一个全新的协议(ws/wss),这意味着并非所有支持HTTP的环境都能天然兼容WebSocket,且其实现相对复杂。

相比之下,SSE基于传统的HTTP协议,是专为服务端向客户端单向推送数据设计的轻量级方案。它无需额外的协议支持,现有服务器软件普遍兼容。SSE简化了实时数据流的处理,特别适合于那些只需服务端定期更新客户端信息,而不需要客户端即时反馈的场景,例如数据大屏展示、实时新闻推送等。

3、SSE工作原理

SSE建立在HTTP长连接基础之上,允许服务端在一次TCP连接中持续发送数据到客户端,而无须客户端频繁请求。这得益于HTTP/1.1的持久连接技术,减少了网络延迟和资源消耗,提高了数据传输效率。SSE支持自动重连机制,当连接意外中断时,客户端能够自动尝试重新建立连接。
SSE 可以传输文本和二进制格式的数据,但只支持单向数据流,即只能由服务器向客户端推送数据。WebSocket 支持双向数据流,客户端和服务器可以互相发送消息,并且没有消息大小限制。

4、主要API及使用示例

 1)建立链接

let source = new EventSource('http://yourserver.com/sse');

2)链接状态

source.readyState:
0 表示正在连接或已断开。
1 表示连接已建立,数据可接收。
2 表示连接关闭且不再重试。

3)事件处理

source.onopen: 当连接建立时触发。
source.onmessage: 收到服务端推送的数据时触发。
source.onerror: 发生错误时触发。

4、实战案例

1)后端代码

@GetMapping(value = "/testSSE",produces = "text/event-stream")
@ApiOperation("测试1")
public SseEmitter test() throws ParseException {
    //逻辑每10秒发送一条固定数据,具体代码
    SseEmitter sseEmitter = new SseEmitter();
    ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
    Runnable dataSednTask =  ()->{
        //处理具体逻辑
        try {
            MqMessage message = new MqMessage();
            message.setCreateTime(new Date());
            sseEmitter.send(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    };
    executorService.scheduleAtFixedRate(dataSednTask, 0, 10 * 1000,TimeUnit.MILLISECONDS);
    return sseEmitter;
}

2)前端VUE代码

created(){

},
mounted() {
  let source = new EventSource('http://localhost:9020/testSSE');
  source.onmessage = function(e) {
    console.log("onmessage",source.readyState);
    console.log(e.data);
    console.log(JSON.parse(e.data));
  };
  source.onerror = function(e) {
    console.log("onerror",source.readyState);
  };
  source.onopen = function(e) {
    console.log("onopen",source.readyState);
  };
},

3)结果展示

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

StruggleRookie

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

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

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

打赏作者

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

抵扣说明:

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

余额充值