SpringBoot整合WebSocket實現(xiàn)后端向前端發(fā)送消息的實例代碼
一、什么是 websocket 接口
使用 websocket 建立長連接,服務(wù)端和客戶端可以互相通信,服務(wù)端只要有數(shù)據(jù)更新,就可以主動推給客戶端。
WebSocket 使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù)。在 WebSocket API 中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。
在 WebSocket API 中,瀏覽器和服務(wù)器只需要做一個握手的動作,然后,瀏覽器和服務(wù)器之間就形成了一條快速通道。兩者之間就直接可以數(shù)據(jù)互相傳送。
二、適用場景
在業(yè)務(wù)開發(fā)過程中碰到一些異步處理(微信支付、支付寶支付的支付通知),跨應(yīng)用的消息傳遞。
當(dāng)業(yè)務(wù)執(zhí)行完畢后,需要將成功的信息投遞給前端。一般情況下都是前端調(diào)用后端的http/https接口獲取數(shù)據(jù),后端想要主動推送消息給前端就需要使用到WebSocket進(jìn)行前后端的通信。
三、示例代碼
3.1、添加pom.xml依賴
<!-- websocket--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
3.2、創(chuàng)建WebSokcet配置類
@Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter(){ return new ServerEndpointExporter(); } } 3.3、創(chuàng)建WebSokcet工具類 @ServerEndpoint(value = "/websocket") @Component public class WebSocketServer { private final static Logger log = LoggerFactory.getLogger(WebSocketServer.class); //靜態(tài)變量,用來記錄當(dāng)前在線連接數(shù)。應(yīng)該把它設(shè)計成線程安全的。 private static int onlineCount = 0; //concurrent包的線程安全Set,用來存放每個客戶端對應(yīng)的MyWebSocket對象。 private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>(); //與某個客戶端的連接會話,需要通過它來給客戶端發(fā)送數(shù)據(jù) private Session session; /** * 連接建立成功調(diào)用的方法 */ @OnOpen public void onOpen(Session session) { this.session = session; //加入set中 webSocketSet.add(this); //在線數(shù)加1 addOnlineCount(); log.info("有新連接加入!當(dāng)前在線人數(shù)為" + getOnlineCount()); try { MsgResponseVo userMsgResponseVo = new MsgResponseVo(); userMsgResponseVo.setMsg("SUCCESS"); WebSocketServer.sendInfo(JSON.toJSONString(userMsgResponseVo)); } catch (IOException e) { log.error("websocket IO異常"); } } /** * 連接關(guān)閉調(diào)用的方法 */ @OnClose public void onClose() { //從set中刪除 webSocketSet.remove(this); //在線數(shù)減1 subOnlineCount(); log.info("有一連接關(guān)閉!當(dāng)前在線人數(shù)為" + getOnlineCount()); } /** * 收到客戶端消息后調(diào)用的方法 * * @param message 客戶端發(fā)送過來的消息 */ @OnMessage public void onMessage(String message, Session session) { log.info("來自客戶端的消息:" + message); //群發(fā)消息 for (WebSocketServer item : webSocketSet) { try { item.sendMessage(message); } catch (IOException e) { e.printStackTrace(); } } } /** * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { log.error("發(fā)生錯誤"); error.printStackTrace(); } public void sendMessage(String message) throws IOException { this.session.getBasicRemote().sendText(message); } /** * 群發(fā)自定義消息 */ public static void sendInfo(String message) throws IOException { log.info(message); for (WebSocketServer item : webSocketSet) { try { item.sendMessage(message); } catch (IOException e) { continue; } } } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { WebSocketServer.onlineCount++; } public static synchronized void subOnlineCount() { WebSocketServer.onlineCount--; } }
3.3、創(chuàng)建測試發(fā)送消息接口
@GetMapping("/testWebSocket") public ApiRestResponse testWebSocket() throws IOException { //消息體 MsgResponseVo technicianMsgResponseVo = new MsgResponseVo(); technicianMsgResponseVo.setRole("Technician"); technicianMsgResponseVo.setRoleId(1); technicianMsgResponseVo.setMsg("您的訂單已取消"); technicianMsgResponseVo.setMsgStatus("CANCEL_ORDER"); technicianMsgResponseVo.setOrderNo("test"); //發(fā)送消息 WebSocketServer.sendInfo(JSON.toJSONString(technicianMsgResponseVo)); return ApiRestResponse.success(); } }
3.4、測試webSocket
(http://www.jsons.cn/websocket/)
在網(wǎng)站中輸入ws://ip:端口/webSocket工具類的前綴(ws://127.0.0.1:8080/websocket)
3.5、前端使用WebSocket監(jiān)聽后端WebSocket地址 ,接收到消息后做下一步業(yè)務(wù)處理。
總結(jié)
到此這篇關(guān)于SpringBoot整合WebSocket實現(xiàn)后端向前端發(fā)送消息的文章就介紹到這了,更多相關(guān)SpringBoot整合WebSocket發(fā)送消息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot實現(xiàn)人臉識別與WebSocket長連接的實現(xiàn)代碼
- SpringBoot+WebSocket實現(xiàn)IM及時通訊的代碼示例
- SpringBoot+websocket實現(xiàn)消息對話功能
- SpringBoot 整合WebSocket 前端 uniapp 訪問的詳細(xì)方法
- Springboot+WebSocket+Netty實現(xiàn)在線聊天/群聊系統(tǒng)
- SpringBoot集成WebSocket的兩種方式(JDK內(nèi)置版和Spring封裝版)
- SpringBoot中使用WebSocket的教程分享
- SpringBoot實現(xiàn)WebSocket全雙工通信的項目實踐
- 使用WebSocket+SpringBoot+Vue搭建簡易網(wǎng)頁聊天室的實現(xiàn)代碼
- Springboot+WebSocket實現(xiàn)在線聊天功能
- springboot中websocket簡單實現(xiàn)
- Spring Boot中的WebSocketMessageBrokerConfigurer接口使用
相關(guān)文章
Java實現(xiàn)生成n個不重復(fù)的隨機(jī)數(shù)
這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)生成n個不重復(fù)的隨機(jī)數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-05-05Spring?Data?JPA系列JpaSpecificationExecutor用法詳解
這篇文章主要為大家介紹了Spring?Data?JPA系列JpaSpecificationExecutor用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09IDEA提示:Boolean method ‘xxx‘ is always&nb
這篇文章主要介紹了IDEA提示:Boolean method ‘xxx‘ is always inverted問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08Java中ClassLoader類加載學(xué)習(xí)總結(jié)
本篇文章主要給大家講述了Java中ClassLoader類加載的原理以及用法總結(jié),一起學(xué)習(xí)下。2017-12-12Dubbo+Nacos服務(wù)啟動報錯,返回unknown user的問題
這篇文章主要介紹了Dubbo+Nacos服務(wù)啟動報錯,返回unknown user的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09詳解Spring Cloud微服務(wù)架構(gòu)下的WebSocket解決方案
這篇文章主要介紹了詳解Spring Cloud微服務(wù)架構(gòu)下的WebSocket解決方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12Spring容器刷新obtainFreshBeanFactory示例詳解
這篇文章主要為大家介紹了Spring容器刷新obtainFreshBeanFactory示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03