日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Springboot整合websocket实现一对一消息推送和广播消息推送

發布時間:2025/3/20 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Springboot整合websocket实现一对一消息推送和广播消息推送 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今日推薦

后端接口如何提高性能?

16 個寫代碼的好習慣

為什么不推薦使用BeanUtils屬性轉換工具

盤點阿里巴巴 34 個牛逼 GitHub 項目

常見代碼重構技巧(非常實用)

作者:kunm

segmentfault.com/a/1190000011908831

springboot基礎環境

請參考springboot文檔

maven依賴
????????<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>
代碼準備
準備常量類
????//webSocket相關配置//鏈接地址public?static?String?WEBSOCKETPATHPERFIX?=?"/ws-push";public?static?String?WEBSOCKETPATH?=?"/endpointWisely";//消息代理路徑public?static?String?WEBSOCKETBROADCASTPATH?=?"/topic";//前端發送給服務端請求地址public?static?final?String?FORETOSERVERPATH?=?"/welcome";//服務端生產地址,客戶端訂閱此地址以接收服務端生產的消息public?static?final?String?PRODUCERPATH?=?"/topic/getResponse";//點對點消息推送地址前綴public?static?final?String?P2PPUSHBASEPATH?=?"/user";//點對點消息推送地址后綴,最后的地址為/user/用戶識別碼/msgpublic?static?final?String?P2PPUSHPATH?=?"/msg";
接收前端消息實體
public?class?WiselyMessage?{private?String?name;public?String?getName()?{return?name;}public?void?setName(String?name)?{this.name?=?name;} }
后臺發送消息實體
private?String?responseMessage;public?WiselyResponse(String?responseMessage){this.responseMessage?=?responseMessage;}public?String?getResponseMessage()?{return?responseMessage;}public?void?setResponseMessage(String?responseMessage)?{this.responseMessage?=?responseMessage;} 配置websocket @Configuration //?@EnableWebSocketMessageBroker注解用于開啟使用STOMP協議來傳輸基于代理(MessageBroker)的消息,這時候控制器(controller) //?開始支持@MessageMapping,就像是使用@requestMapping一樣。 @EnableWebSocketMessageBroker public?class?WebSocketConfig?extends?AbstractWebSocketMessageBrokerConfigurer?{@Overridepublic?void?registerStompEndpoints(StompEndpointRegistry?stompEndpointRegistry)?{//注冊一個Stomp的節點(endpoint),并指定使用SockJS協議。stompEndpointRegistry.addEndpoint(Constant.WEBSOCKETPATH).withSockJS();}@Overridepublic?void?configureMessageBroker(MessageBrokerRegistry?registry)?{//服務端發送消息給客戶端的域,多個用逗號隔開registry.enableSimpleBroker(Constant.WEBSOCKETBROADCASTPATH,?Constant.P2PPUSHBASEPATH);//定義一對一推送的時候前綴registry.setUserDestinationPrefix(Constant.P2PPUSHBASEPATH);//定義websoket前綴registry.setApplicationDestinationPrefixes(Constant.WEBSOCKETPATHPERFIX);} } service @Service public?class?WebSocketService?{@Autowiredprivate?SimpMessagingTemplate?template;/***?廣播*?發給所有在線用戶**?@param?msg*/public?void?sendMsg(WiselyResponse?msg)?{template.convertAndSend(Constant.PRODUCERPATH,?msg);}/***?發送給指定用戶*?@param?users*?@param?msg*/public?void?send2Users(List<String>?users,?WiselyResponse?msg)?{users.forEach(userName?->?{template.convertAndSendToUser(userName,?Constant.P2PPUSHPATH,?msg);});} }
控制器
@Controller public?class?WsController?{@ResourceWebSocketService?webSocketService;@MessageMapping(Constant.FORETOSERVERPATH)//@MessageMapping和@RequestMapping功能類似,用于設置URL映射地址,瀏覽器向服務器發起請求,需要通過該地址。@SendTo(Constant.PRODUCERPATH)//如果服務器接受到了消息,就會對訂閱了@SendTo括號中的地址傳送消息。public?WiselyResponse?say(WiselyMessage?message)?throws?Exception?{List<String>?users?=?Lists.newArrayList();users.add("d892bf12bf7d11e793b69c5c8e6f60fb");//此處寫死只是為了方便測試,此值需要對應頁面中訂閱個人消息的userIdwebSocketService.send2Users(users,?new?WiselyResponse("admin?hello"));return?new?WiselyResponse("Welcome,?"?+?message.getName()?+?"!");} }
頁面
<!DOCTYPE?html> <html?xmlns:th="http://www.thymeleaf.org"> <head><meta?charset="UTF-8"?/><title>Spring?Boot+WebSocket+廣播式</title></head> <body?onload="disconnect()"> <noscript><h2?style="color:?#ff0000">貌似你的瀏覽器不支持websocket</h2></noscript> <div><div><button?id="connect"?onclick="connect();">連接</button><button?id="disconnect"?disabled="disabled"?onclick="disconnect();">斷開連接</button></div><div?id="conversationDiv"><label>輸入你的名字</label><input?type="text"?id="name"?/><button?id="sendName"?onclick="sendName();">發送</button><p?id="response"></p><p?id="response1"></p></div> </div> <!--<script?th:src="@{sockjs.min.js}"></script> <script?th:src="@{stomp.min.js}"></script> <script?th:src="@{jquery.js}"></script>--> <script?src="https://cdn.bootcss.com/sockjs-client/1.1.4/sockjs.min.js"></script> <script?src="https://cdn.bootcss.com/stomp.js/2.3.3/stomp.min.js"></script> <script?src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> <script?th:inline="javascript">var?stompClient?=?null;//此值有服務端傳遞給前端,實現方式沒有要求var?userId?=?[[${userId}]];function?setConnected(connected)?{document.getElementById('connect').disabled?=?connected;document.getElementById('disconnect').disabled?=?!connected;document.getElementById('conversationDiv').style.visibility?=?connected???'visible'?:?'hidden';$('#response').html();}function?connect()?{var?socket?=?new?SockJS('/endpointWisely');?//1連接SockJS的endpoint是“endpointWisely”,與后臺代碼中注冊的endpoint要一樣。stompClient?=?Stomp.over(socket);//2創建STOMP協議的webSocket客戶端。stompClient.connect({},?function(frame)?{//3連接webSocket的服務端。setConnected(true);console.log('開始進行連接Connected:?'?+?frame);//4通過stompClient.subscribe()訂閱服務器的目標是'/topic/getResponse'發送過來的地址,與@SendTo中的地址對應。stompClient.subscribe('/topic/getResponse',?function(respnose){showResponse(JSON.parse(respnose.body).responseMessage);});//4通過stompClient.subscribe()訂閱服務器的目標是'/user/'?+?userId?+?'/msg'接收一對一的推送消息,其中userId由服務端傳遞過來,用于表示唯一的用戶,通過此值將消息精確推送給一個用戶stompClient.subscribe('/user/'?+?userId?+?'/msg',?function(respnose){console.log(respnose);showResponse1(JSON.parse(respnose.body).responseMessage);});});}function?disconnect()?{if?(stompClient?!=?null)?{stompClient.disconnect();}setConnected(false);console.log("Disconnected");}function?sendName()?{var?name?=?$('#name').val();//通過stompClient.send()向地址為"/welcome"的服務器地址發起請求,與@MessageMapping里的地址對應。因為我們配置了registry.setApplicationDestinationPrefixes(Constant.WEBSOCKETPATHPERFIX);所以需要增加前綴/ws-push/stompClient.send("/ws-push/welcome",?{},?JSON.stringify({?'name':?name?}));}function?showResponse(message)?{var?response?=?$("#response");response.html(message);}function?showResponse1(message)?{var?response?=?$("#response1");response.html(message);} </script> </body> </html>
測試


點擊連接控制臺輸出

表示連接成功并且訂閱了兩個地址

此時在文本框內輸入任意值,結果如圖所示則代表成功

控制臺中顯示依次為,發送信息,目標長度內容

此時服務端控制器接收到請求

同時給指定用戶發送了消息,所以控制臺接收到消息

同時因為控制器有注解@SendTo所以會向@SendTo的地址廣播消息,客戶端訂閱了廣播地址所有控制臺顯示接收了消息

推薦文章
  • 14個項目!

  • 一款小清新的 SpringBoot+ Mybatis 前后端分離后臺管理系統項目

  • 47K Star 的SpringBoot+MyBatis+docker電商項目,附帶超詳細的文檔!

  • 寫博客能月入10K?

  • 一款基于 Spring Boot 的現代化社區(論壇/問答/社交網絡/博客)

更多項目源碼
  • 這或許是最美的Vue+Element開源后臺管理UI

  • 推薦一款高顏值的 Spring Boot 快速開發框架

  • 一款基于 Spring Boot 的現代化社區(論壇/問答/社交網絡/博客)

  • 13K點贊都基于 Vue+Spring 前后端分離管理系統ELAdmin,大愛

  • 想接私活時薪再翻一倍,建議根據這幾個開源的SpringBoot

總結

以上是生活随笔為你收集整理的Springboot整合websocket实现一对一消息推送和广播消息推送的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 狠狠爱综合网 | 欧美精品一卡 | 国产精品国产一区二区 | 色中色av | 成人福利网址 | 国产制服丝袜 | ass极品国模人体欣赏 | 日日夜夜艹| 老司机深夜福利网站 | 熟妇人妻av无码一区二区三区 | av片在线免费观看 | 素人一区二区 | 免费看a的网站 | 一色桃子juy758在线播放 | jiz亚洲| 大尺度做爰呻吟舌吻情头 | 亚洲精品乱码久久久久久黑人 | 国产精品视屏 | 懂色av蜜臀av粉嫩av分享吧最新章节 | 成人h动漫在线 | 天天搞夜夜爽 | 精精国产xxxx视频在线 | 青青草原在线免费观看视频 | 黄色视屏网站 | 蜜桃av一区二区三区 | 放几个免费的毛片出来看 | 福利小视频在线观看 | 一级做a爱片 | 在线看麻豆| 国产午夜无码精品免费看奶水 | 国产小精品 | 欧美日韩性生活 | 免费在线一区二区三区 | 久久国产成人精品av | 欧美日a | 日本不卡一区二区三区视频 | 亚洲av无码久久精品色欲 | 在线观看精品一区 | 日本亚洲一区二区三区 | 绿帽单男| 日本嫩草影院 | 久久久久久久久久久福利 | 欧美激情视频一区二区三区 | 成人av免费在线播放 | 欧美日韩精品三区 | 国产三区在线成人av | 国产精品女人久久久 | 韩国三级hd中文字幕有哪些 | 告诉我真相俄剧在线观看 | 中文字幕无码精品亚洲资源网久久 | 精品日本一区二区 | 成人免费黄色网 | 国产一区二区自拍视频 | 91黑丝美女 | 久久久最新 | 一区二区三区在线免费观看 | 久久观看最新视频 | 爱爱一级 | 污视频免费看 | 成人毛片在线精品国产 | 国产精品厕所 | 久久精品免费一区二区 | 天堂在线视频 | 99精品99| 亚洲蜜桃av一区二区 | 日韩欧美一区在线观看 | 青娱乐91 | 91丨国产丨捆绑调教 | 久久久久久久久久久久97 | 成人黄色短视频在线观看 | 人人爽av | 久久久久亚洲av无码专区 | 初恋视频污 | 西西444www大胆无视频 | 丁香六月av | 欧洲成人免费视频 | 国产美女一区二区 | xxx视频在线观看 | 免费黄色小视频网站 | 亚洲第一黄色片 | 亚洲av人人夜夜澡人人 | 欧美肉丝袜videos办公室 | 日韩精品自拍偷拍 | 污污视频在线观看网站 | 日本青青草视频 | 国产99热 | 日韩欧美高清在线视频 | 久久爱伊人 | 久草黄色 | 女生和男生一起插插插 | www.精品| 四季av在线一区二区三区 | 免费性视频 | 中文字幕日韩三级 | 国产成人精品一区二区无码呦 | 欧美成人精品在线 | av大片在线免费观看 | 中文字幕av播放 | 激情拍拍|