国内大型php网站建设,母版页做网站例子,wordpress会员列表,三台建设局网站Server-Sent Events特点与优势
后端可以向前端发送信息#xff0c;类似于websocket#xff0c;但是websocket是双向通信#xff0c;但是sse为单向通信#xff0c;服务器只能向客户端发送文本信息#xff0c;效率比websocket高。
单向通信#xff1a;SSE只支持服务器到客…Server-Sent Events特点与优势
后端可以向前端发送信息类似于websocket但是websocket是双向通信但是sse为单向通信服务器只能向客户端发送文本信息效率比websocket高。
单向通信SSE只支持服务器到客户端的单向通信。这对于那些只需要服务器推送数据而无需客户端响应的场景非常有效例如实时新闻、股票报价更新等。
简单轻量SSE在实现上通常比WebSocket更简单和轻量因为它是基于标准的HTTP协议实现的。
自动重连SSE支持自动重连机制如果连接断开浏览器会尝试重新建立连接。
易于使用和兼容性对于简单的单向数据流SSE更容易实现且兼容性较好。
后端代码
stream() 方法返回的 SseEmitter 对象用于建立一个 SSE (Server-Sent Events) 连接但它本身并不负责推送数据。这个方法的主要作用是
建立连接当客户端请求 /notification 路径时stream() 方法被调用创建并返回一个 SseEmitter 实例。这个实例代表了与客户端之间的一个长连接。
保持连接开启这个连接将保持开启状态直到服务器发送完成信号或连接超时。这允许服务器在后续任何时间点向客户端推送数据。
等待数据推送虽然 stream() 方法创建了连接但实际的数据推送是由其他部分的代码来处理的。通常这涉及到在服务层或控制器的其他部分设置逻辑以在某些事件发生时调用 SseEmitter 的 send() 方法来推送数据。
连接默认超时时间为三十分钟这是设置为1天。
RestController
RequestMapping(/admin/homePage)
public class NotificationSSEController {// executorService: 一个线程池用于管理和执行后台任务。private final ExecutorService executorService Executors.newCachedThreadPool();// emitter: 用于SSE服务器发送事件的SseEmitter实例。这个对象用来向客户端发送实时更新。// SseEmitter是Spring框架提供的一个类用于处理HTTP连接以发送SSE。// 1天 24小时 * 60分钟 * 60秒 * 1000毫秒private SseEmitter emitter new SseEmitter(24L * 60 * 60 * 1000);/*** 返回的是sse连接不参与返回数据* return*/CrossOriginGetMapping(value /notification, produces MediaType.TEXT_EVENT_STREAM_VALUE)public SseEmitter stream() {sendNotification(); // 当客户端连接时立即发送通知return emitter;}// A函数Spring Boot定时函数每10秒执行一次Scheduled(fixedRate 1000)public void scheduledTask() {sendNotification();}// B函数负责SSE发送public void sendNotification() {executorService.execute(() - {try {NotificationSSE notificationSSE new NotificationSSE();emitter.send(SseEmitter.event().id(String.valueOf(System.currentTimeMillis())).data(JSONObject.toJSONString(notificationSSE)));} catch (Exception e) {emitter.completeWithError(e);}});}
}前端代码
!DOCTYPE html
html
headtitleSSE Example/title
/head
body
scriptvar eventSource new EventSource(http://localhost/admin/homePage/notification);eventSource.onmessage function(event) {console.log(event.data);};
/script
/body
/html