ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Server-Sent Events入门

2021-07-25 02:00:06  阅读:253  来源: 互联网

标签:response Events SseEmitter Server event Sent


前言

SSE(Server-Sent Events)是一种服务器消息推送技术,是HTML5标准协议中的一部分,类似WebSocket,不同在于WebSocket可以双向通信,SSE只能服务器向浏览器发送消息。具体的规范可以查看 MDN

简单使用

客户端,注意IE浏览器可能不支持

<script>
    // 初始化, 参数为url
    // 依赖H5
    var sse = new EventSource("test");

    sse.onmessage = function (e) {
        console.log("message", e.data, e);
    };
    // 监听指定事件, (就不会进入onmessage了)
    sse.addEventListener("me", function (e) {
        console.log("me event", e.data);
    });
</script>

服务器端,指定响应的 content-type 为 text/event-stream

@GetMapping(value = "/test", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
  public void test(HttpServletResponse response) throws IOException {
    response.setContentType("text/event-stream");
    response.setCharacterEncoding("utf-8");
    // 指定事件标识
    response.getWriter().write("event:me\n");
    // ID
    response.getWriter().write("id:" + UUID.randomUUID().toString() + "\n");
    // 格式: data: + 数据 + 2个回车
    response.getWriter().write("data:hello eventsource" + "\n\n");
    response.getWriter().flush();
  }

服务器连接中断,客户端会自动重连,默认超时重连时间为3秒。

Spring对SSE的支持

@GetMapping(value = "/test", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
  public SseEmitter test() throws IOException {
    SseEmitter emitter = new SseEmitter();
    SseEventBuilder builder = SseEmitter.event()
        .name("me")
        .id(UUID.randomUUID().toString())
        .data("hello eventsource2");
    emitter.send(builder);
    emitter.complete();
    return emitter;
  }

方法返回值为SseEmitter,继承于ResponseBodyEmitter,SpringMVC中提供了ResponseBodyEmitterReturnValueHandler类来处理这种类型。

SpringBootAdmin(一个管理和监控SpringBoot应用的框架) 源码中就使用到了SSE。

参考

Server-Sent Events 教程
Server-Sent Events 的协议细节和实现
服务端推送技术 Server-sent Events 快速上手
详解Spring 5 Server-Sent Events(一) 基本介绍

标签:response,Events,SseEmitter,Server,event,Sent
来源: https://www.cnblogs.com/strongmore/p/15056942.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有