Server-Sent Events特點與優(yōu)勢
后端可以向前端發(fā)送信息,類似于websocket,但是websocket是雙向通信,但是sse為單向通信,服務(wù)器只能向客戶端發(fā)送文本信息,效率比websocket高。
單向通信:SSE只支持服務(wù)器到客戶端的單向通信。這對于那些只需要服務(wù)器推送數(shù)據(jù)而無需客戶端響應(yīng)的場景非常有效,例如實時新聞、股票報價更新等。
簡單輕量:SSE在實現(xiàn)上通常比WebSocket更簡單和輕量,因為它是基于標(biāo)準(zhǔn)的HTTP協(xié)議實現(xiàn)的。
自動重連:SSE支持自動重連機制,如果連接斷開,瀏覽器會嘗試重新建立連接。
易于使用和兼容性:對于簡單的單向數(shù)據(jù)流,SSE更容易實現(xiàn),且兼容性較好。
后端代碼?
stream() 方法返回的 SseEmitter 對象用于建立一個 SSE (Server-Sent Events) 連接,但它本身并不負(fù)責(zé)推送數(shù)據(jù)。這個方法的主要作用是:
建立連接:當(dāng)客戶端請求 /notification 路徑時,stream() 方法被調(diào)用,創(chuàng)建并返回一個 SseEmitter 實例。這個實例代表了與客戶端之間的一個長連接。
保持連接開啟:這個連接將保持開啟狀態(tài),直到服務(wù)器發(fā)送完成信號或連接超時。這允許服務(wù)器在后續(xù)任何時間點向客戶端推送數(shù)據(jù)。
等待數(shù)據(jù)推送:雖然 stream() 方法創(chuàng)建了連接,但實際的數(shù)據(jù)推送是由其他部分的代碼來處理的。通常,這涉及到在服務(wù)層或控制器的其他部分設(shè)置邏輯,以在某些事件發(fā)生時調(diào)用 SseEmitter 的 send() 方法來推送數(shù)據(jù)。
連接默認(rèn)超時時間為三十分鐘,這是設(shè)置為1天。文章來源:http://www.zghlxwxcb.cn/news/detail-817620.html
@RestController
@RequestMapping("/admin/homePage")
public class NotificationSSEController {
// executorService: 一個線程池,用于管理和執(zhí)行后臺任務(wù)。
private final ExecutorService executorService = Executors.newCachedThreadPool();
// emitter: 用于SSE(服務(wù)器發(fā)送事件)的SseEmitter實例。這個對象用來向客戶端發(fā)送實時更新。
// SseEmitter是Spring框架提供的一個類,用于處理HTTP連接以發(fā)送SSE。
// 1天 = 24小時 * 60分鐘 * 60秒 * 1000毫秒
private SseEmitter emitter = new SseEmitter(24L * 60 * 60 * 1000);
/**
* 返回的是sse連接,不參與返回數(shù)據(jù)
* @return
*/
@CrossOrigin
@GetMapping(value = "/notification", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter stream() {
sendNotification(); // 當(dāng)客戶端連接時立即發(fā)送通知
return emitter;
}
// A函數(shù):Spring Boot定時函數(shù),每10秒執(zhí)行一次
@Scheduled(fixedRate = 1000)
public void scheduledTask() {
sendNotification();
}
// B函數(shù):負(fù)責(zé)SSE發(fā)送
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>
<head>
<title>SSE Example</title>
</head>
<body>
<script>
var eventSource = new EventSource("http://localhost/admin/homePage/notification");
eventSource.onmessage = function(event) {
console.log(event.data);
};
</script>
</body>
</html>
文章來源地址http://www.zghlxwxcb.cn/news/detail-817620.html
到了這里,關(guān)于Java Server-Sent Events通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!