首页 > 其他分享 >初识SSE

初识SSE

时间:2024-02-21 23:44:06浏览次数:16  
标签:id Field 初识 SSE message data event

Event Stream WebSocket
基于HTTP协议 独立协议
轻量 简单 较为复杂
默认支持断线重连 自己实现
传输文本 传输二进制

HTTP请求、响应头

Content-Type: text/event-stream

数据格式

[field]:value\n
每行数据的格式都是[field]:value\n,数据以\n\n结束。
其中field可选项为: 空、id、event、data、retry。

Field可选项介绍

Field为空

:xxx\n
这时客户端要忽略消息内容,可以看作一种心跳机制。

Field为data

data:this is data\n\n

data:data1\n
data:data2\n\n

data表示为数据,一段消息内可以出现多个data。

Field为id

id:messagexxx\n
data:messageyyy\n\n

id为数据的唯一编号,浏览器会保存在lastEventId属性中,重连的时候会通过Last-event-ID请求头告知服务器消费位置。

Field为event

event:event1
data:dataxxx\n\n

data:dataxxx\n
data:datayy\n\n

event对应事件名称,可以根据事件名称来订阅事件。
event对应的值为空时,默认为message

Field为retry

retry:1000\n
data:xxxxxxx\n\n

指定浏览器重新发起链接的时间间隔,即断开连接后,等待该时间后再重连。

总结

除data外,所有Field都是可选的,data可以出现多次,其余的最多出现一次。

示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>SSE Demo</title>
</head>
<body>
<h1>SSE Demo</h1>
<div id="messages"></div>

<script>
    if (!!window.EventSource) {
        const source = new EventSource("/sse");
        source.onmessage = function(event) {
            const message = document.getElementById('messages');
            message.innerHTML += event.data + "<br>";
        };
        source.onerror = function(error) {
            console.log('EventSource failed:', error);
        };

        source.addEventListener("custom", event => {
            const message = document.getElementById('messages');
            message.innerHTML += event.data + "<br>";
        });

    } else {
        document.getElementById('messages').innerHTML = "Your browser doesn't support SSE!";
    }
</script>
</body>
</html>
@RestController
public class SseController {
    private ExecutorService executor = Executors.newSingleThreadExecutor();

    @GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public SseEmitter stream(@RequestHeader(name = "last-event-id", required = false) String lastEventId) {
        System.out.println(lastEventId);
        SseEmitter emitter = new SseEmitter();

        final int continueI = lastEventId == null ? 0 : Integer.parseInt(
                lastEventId.substring(lastEventId.lastIndexOf(":") + 2)
        );

        executor.submit(() -> {
            try {
                for (int i = continueI; true; i++) {
                    SseEmitter.SseEventBuilder eb = null;
                    if (i % 3 == 0) {
                        eb = SseEmitter.event()
                                .id(i+"")
                                .data("SSE message " + i)
                                .reconnectTime(10000)
                                .name("message");
                    } else {
                        eb = SseEmitter.event()
                                .id(i+"")
                                .data("custom message " + i)
                                .reconnectTime(10000)
                                .name("custom");
                    }
                    emitter.send(eb);
                    Thread.sleep(3000);
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
                emitter.completeWithError(e);
            }
        });

        return emitter;
    }
}

标签:id,Field,初识,SSE,message,data,event
From: https://www.cnblogs.com/shames/p/18023152

相关文章

  • Go - Type assertions and Type switches
    TypeassertionsForanexpression x of interfacetype,butnota typeparameter,andatype T,theprimaryexpressionx.(T)assertsthat x isnot nil andthatthevaluestoredin x isoftype T.Thenotation x.(T) iscalleda typeassertion.M......
  • 【libGDX】初识libGDX
    1前言​libGDX是一个开源且跨平台的Java游戏开发框架,于2010年3月11日推出0.1版本,它通过OpenGLES2.0/3.0渲染图像,支持Windows、Linux、macOS、Android、iOS、Web等平台,提供了统一的API,用户只需要写一套代码就可以在多个平台上运行,官方介绍见→Features。......
  • 02. 初识HAL库
    一、初识HAL库  STM32开发中常说的HAL库开发,指的是利用HAL库固件包里封装好的C语言编写的驱动文件,来实现对STM32内部和外围电器元件的控制的过程。但只有HAL库还不能直接驱动一个STM32的芯片,其它的组件已经由ARM与众多芯片硬件、软件厂商制定的通用的软件开发标......
  • 初识flowable
    三个月前开始做flowable的项目,刚刚了解一些又中断了,乘着重新开始之前,赶快恶补一下。相信大家在之前已经了解很多关于flowable的知识了,但是很乱,我也是这样。1、对于一个流程来说,你肯定要开启流程。当提交人提交的那一瞬间,流程被开启。这个开启方法需要我们自己去写,并且可以携带......
  • Unity基于AssetBundle资源管理流程详解
    在Unity游戏开发中,资源管理是一个非常重要的环节。随着游戏的发展,资源会变得越来越庞大,因此需要一种高效的资源管理方式来减少内存占用和加快加载速度。AssetBundle是Unity提供的一种资源打包和加载方式,可以将资源打包成一个独立的文件,然后在运行时进行加载和卸载。本文将详细介绍......
  • WebAssembly照亮了 Web端软件的未来
    WebAssembly的发展历程相对较短,但影响深远。WebAssembly于2015年首次发布,先驱技术是来自Mozilla的asm.js和GoogleNativeClient,最初的实现是基于asm.js的功能集。自2017年3月由WebAssembly创造的MVP的预览版发布以来,WebAssembly发展迅速,目前已经部署到了所有主流浏览器。到了......
  • 01. 初识STM32
    一、什么是STM32  STM32,从字面上来理解,ST是意法半导体,M是Microelectronics的缩写,32表示32位,合起来理解,STM32就是指ST公司开发的32位微控制器。  STM32主要分两大块,MCU和MPU,MCU就是我们常见的STM32微控制器,不能跑Linux,而MPU则是ST在19年才推出的微......
  • Blazor WebAssembly 本地调试时如何将项目运行在子目录
    假设项目名为MyApp,想要运行的子目录名也叫MyAppMyApp.csproj<PropertyGroup> <StaticWebAssetBasePath>MyApp</StaticWebAssetBasePath></PropertyGroup>Properties/launchSettings.json"https":{"commandName":"Projec......
  • 初识st表-P2880
    首先讲讲st表。这个东西呢,就是一种利用了倍增思想的预处理数据从而达到快速查询的功能。for(inti=1;i<=n;++i)scanf("%d",&f[i][0]);for(inti=1;i<21;++i){intt1=1<<i-1,t2;t2=t1<<1;for(intj......
  • 【译】使用.NET将WebAssembly扩展到云(一)
    原文|RichardLander翻译|郑子铭WebAssembly(Wasm)是一种令人兴奋的新虚拟机和(汇编)指令格式。Wasm诞生于浏览器,是Blazor项目的重要组成部分。Wasm的第二个行动是针对应用程序和功能的云计算。WebAssembly系统接口(WASI)是新的推动者,为WebAssembly代码提供了一种安......