SpringBoot實(shí)現(xiàn)Server-Sent Events(SSE)的使用完整指南
一、引言
在Web應(yīng)用開(kāi)發(fā)中,實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)推送是一個(gè)常見(jiàn)需求。Server-Sent Events(SSE)是HTML5提供的一種服務(wù)器到客戶端的單向通信技術(shù),允許服務(wù)器主動(dòng)向客戶端推送信息,無(wú)需客戶端不斷輪詢。本文將詳細(xì)介紹如何在Spring Boot應(yīng)用中實(shí)現(xiàn)SSE,并提供完整的代碼示例。
二、SSE的優(yōu)勢(shì)
- 單向通信:服務(wù)器到客戶端的簡(jiǎn)單數(shù)據(jù)流,無(wú)需客戶端發(fā)送請(qǐng)求。
- 輕量級(jí):基于HTTP,不需要額外的框架或協(xié)議。
- 實(shí)時(shí)性:服務(wù)器端數(shù)據(jù)更新可以即時(shí)推送到客戶端。
三、SSE的典型使用場(chǎng)景
- 實(shí)時(shí)通知:如郵件提醒、社交動(dòng)態(tài)更新等。
- 實(shí)時(shí)數(shù)據(jù)展示:如股票市場(chǎng)數(shù)據(jù)、實(shí)時(shí)統(tǒng)計(jì)信息等。
- 在線聊天室:服務(wù)器端推送新消息給所有在線用戶。
四、Spring Boot實(shí)現(xiàn)SSE的步驟
- 創(chuàng)建Spring Boot項(xiàng)目
首先,你需要?jiǎng)?chuàng)建一個(gè)Spring Boot項(xiàng)目??梢允褂肧pring Initializr或者任何IDE來(lái)創(chuàng)建項(xiàng)目,并添加spring-boot-starter-web
依賴。 - 創(chuàng)建SSE端點(diǎn)
在Spring Boot項(xiàng)目中,創(chuàng)建一個(gè)控制器來(lái)處理SSE請(qǐng)求。
import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @RestController public class SseController { private final ExecutorService executor = Executors.newSingleThreadExecutor(); @GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter streamSseMvc() { SseEmitter emitter = new SseEmitter(); executor.execute(() -> { try { for (int i = 0; i < 10; i++) { // 模擬數(shù)據(jù)處理 Thread.sleep(1000); emitter.send("Message " + i); } emitter.complete(); } catch (IOException | InterruptedException e) { emitter.completeWithError(e); } }); return emitter; } }
在上面的代碼中,我們創(chuàng)建了一個(gè)SseEmitter
對(duì)象,并通過(guò)一個(gè)單獨(dú)的線程定期發(fā)送消息到客戶端。
3. 運(yùn)行Spring Boot應(yīng)用
確保你的Spring Boot應(yīng)用已經(jīng)配置好,并且可以運(yùn)行。啟動(dòng)應(yīng)用后,服務(wù)器將在默認(rèn)的8080端口上監(jiān)聽(tīng)。
4. 客戶端代碼
在客戶端,你可以使用以下HTML和JavaScript代碼來(lái)接收SSE。
<!DOCTYPE html> <html> <head> <title>SSE with Spring Boot</title> </head> <body> <h1>Receiving Server-Sent Events</h1> <div id="messages"></div> <script> var eventSource = new EventSource('/sse'); eventSource.onmessage = function(event) { var messages = document.getElementById('messages'); var message = document.createElement('div'); message.textContent = 'Message from server: ' + event.data; messages.appendChild(message); }; eventSource.onerror = function(event) { console.error('EventSource failed:', event); eventSource.close(); }; </script> </body> </html>
五、測(cè)試
啟動(dòng)Spring Boot應(yīng)用,并在瀏覽器中打開(kāi)上述HTML文件。你應(yīng)該能夠看到服務(wù)器發(fā)送的消息每隔一秒出現(xiàn)在頁(yè)面上。
六、總結(jié)
本文展示了如何在Spring Boot應(yīng)用中實(shí)現(xiàn)SSE,通過(guò)簡(jiǎn)單的步驟和代碼示例,你可以輕松地在你的Web應(yīng)用中添加實(shí)時(shí)數(shù)據(jù)推送功能。SSE提供了一種簡(jiǎn)單而有效的方法來(lái)處理實(shí)時(shí)數(shù)據(jù)流,非常適合于需要服務(wù)器主動(dòng)推送信息給客戶端的場(chǎng)景。通過(guò)Spring Boot,我們可以快速地集成和部署SSE功能,為用戶提供更好的實(shí)時(shí)體驗(yàn)。
到此這篇關(guān)于SpringBoot實(shí)現(xiàn)Server-Sent Events(SSE)的使用完整指南的文章就介紹到這了,更多相關(guān)SpringBoot Server-Sent Events(SSE)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot整合websocket后啟動(dòng)報(bào)錯(cuò)(javax.websocket.server.ServerContainer not available)
- SpringBoot服務(wù)設(shè)置禁止server.point端口的使用
- springboot中server.ssl.key-store配置路徑的問(wèn)題小結(jié)
- 使用Java和SpringBoot實(shí)現(xiàn)服務(wù)器發(fā)送事件(Server-Sent Events)
- SpringBoot中的server.context-path的實(shí)現(xiàn)
- SpringBoot開(kāi)啟server:compression:enabled(Illegal character ((CTRL-CHAR, code 31)))的問(wèn)題解決
相關(guān)文章
java迭代器移除元素出現(xiàn)并發(fā)修改異常的原因及解決
這篇文章主要介紹了java迭代器移除元素出現(xiàn)并發(fā)修改異常的原因及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12SpringBoot+Vue+Axios+BootStrap實(shí)現(xiàn)圖書(shū)的增刪改查功能示例
本文主要介紹了SpringBoot+Vue+Axios+BootStrap實(shí)現(xiàn)圖書(shū)的增刪改查功能,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12關(guān)于ApplicationContext的三個(gè)常用實(shí)現(xiàn)類
這篇文章主要介紹了關(guān)于ApplicationContext的三個(gè)常用實(shí)現(xiàn)類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06Java并發(fā)編程加鎖導(dǎo)致的活躍性問(wèn)題詳解方案
所謂并發(fā)編程是指在一臺(tái)處理器上"同時(shí)"處理多個(gè)任務(wù)。并發(fā)是在同一實(shí)體上的多個(gè)事件。多個(gè)事件在同一時(shí)間間隔發(fā)生,所以編寫正確的程序很難,而編寫正確的并發(fā)程序則難上加難2021-10-10Spring?Boot集成etcd的詳細(xì)過(guò)程
etcd是一個(gè)分布式鍵值存儲(chǔ)數(shù)據(jù)庫(kù),用于共享配置和服務(wù)發(fā)現(xiàn),etcd采用Go語(yǔ)言編寫,具有出色的跨平臺(tái)支持,很小的二進(jìn)制文件和強(qiáng)大的社區(qū),這篇文章主要介紹了SpringBoot集成etcd,需要的朋友可以參考下2023-08-08java文件重命名(文件批量重命名)實(shí)例程序代碼分享
這篇文章主要介紹了java文件重命名的程序代碼,大家參考使用吧2013-12-12玩轉(zhuǎn)spring boot 結(jié)合AngularJs和JDBC(4)
玩轉(zhuǎn)spring boot,這篇文章主要介紹了結(jié)合AngularJs和JDBC,玩轉(zhuǎn)spring boot,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01