您的位置:首页 > 健康 > 美食 > 沈阳建设工程信息网 姚军_中山网站建设方案推广_seo做的比较牛的公司_今日重大事件

沈阳建设工程信息网 姚军_中山网站建设方案推广_seo做的比较牛的公司_今日重大事件

2025/4/5 17:52:50 来源:https://blog.csdn.net/szuaudi/article/details/146915555  浏览:    关键词:沈阳建设工程信息网 姚军_中山网站建设方案推广_seo做的比较牛的公司_今日重大事件
沈阳建设工程信息网 姚军_中山网站建设方案推广_seo做的比较牛的公司_今日重大事件

SSE简介

严格地说,HTTP 协议无法做到服务器主动推送信息。但是,有一种变通方法,就是服务器向客户端声明,接下来要发送的是流信息(streaming)。


也就是说,发送的不是一次性的数据包,而是一个数据流,会连续不断地发送过来。这时,客户端不会关闭连接,会一直等着服务器发过来的新的数据流,视频播放就是这样的例子。本质上,这种通信就是以流信息的方式,完成一次用时很长的下载。


SSE 就是利用这种机制,使用流信息向浏览器推送信息。它基于 HTTP 协议,目前除了 IE/Edge,其他浏览器都支持。


--------Server-Sent Events 教程 - 阮一峰的网络日志

服务端实现

SpringMVC支持了SSE,所以不需要引入额外的包。SpringMVC实现SSE主要借助ResponseBodyEmitter SseEmitter SseEmitter ResponseBodyEmitter 的子类。访问Asynchronous Requests :: Spring Framework查看官方对SSE实现的介绍。

@RestController
public class SseSampleController {ExecutorService executorService = Executors.newSingleThreadExecutor();@GetMapping("/sse")@CrossOrigin()public SseEmitter sse() {SseEmitter emitter = new SseEmitter();emitter.onTimeout(() -> System.out.println("timeout"));emitter.onCompletion(() -> System.out.println("completion"));emitter.onError((e) -> System.out.println("error"));executorService.submit(() -> {try {emitter.send(SseEmitter.event().id("1").data("start"));for (int i = 0; i < 5; i++) {emitter.send(SseEmitter.event().id("1").data(i));Thread.sleep(1000);}emitter.send(SseEmitter.event().id("1").data("end"));emitter.complete();} catch (IOException | InterruptedException e) {emitter.completeWithError(e);}});return emitter;}
}

客户端实现

客户端主要使用js的EventSource对象。

eventSource = new EventSource("http://localhost:8090/sse")
eventSource.onerror=()=>eventSource.close()
eventSource.onmessage=(event)=>console.log(event.data)

部署测试

SseSampleController 类已经通过@CrossOrigin注解允许跨域访问,可以在浏览器控制台上直接执行客户端代码。
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com