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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

springboot 之 webscoket 服务端推送

發布時間:2023/12/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboot 之 webscoket 服务端推送 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

因為最近有后端實時推送數據的需求,所以想到了websocket組件,在此寫一下springboot集成使用websocket的方法,供各位童鞋參考。

注:基于test項目。

1.首先打開pom.xml引入相關依賴

<!-- webSocket --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <!-- thymeleaf模板引擎 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>

2.編寫websocket配置文件:

@Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {@Override public void registerStompEndpoints(StompEndpointRegistry registry) {//注冊STOMP協議的節點(endpoint),并映射指定的url //注冊一個STOMPendpoint,并指定使用SockJS協議 // 允許使用socketJs方式訪問,訪問點為webSocketServer,允許跨域 // 在網頁上我們就可以通過這個鏈接來和服務器的WebSocket連接 registry.addEndpoint("/endpointTest").setAllowedOrigins("*").withSockJS(); }@Override public void configureMessageBroker(MessageBrokerRegistry registry) {//配置消息代理(Message Broker) //廣播式應配置一個/topic消息代理 //queue 點對點 registry.enableSimpleBroker("/queue","/topic"); } }

3.webmvc配置

/** * @author xiaofeng * @version V1.0 * @title: WebMvcConfig.java * @package: com.yingda.xsignal.test * @description: 配置viewController, 為頁面提供路徑映射 * @date 2018/3/30 0030 下午 7:05 */ @Controller public class WebMvcConfig extends WebMvcConfigurerAdapter {/** * 配置viewController,提供映射路徑 */ @Override public void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/webSocket").setViewName("/webSocket"); } }

4.websocket控制器

/** * @author xiaofeng * @version V1.0 * @title: WebSocketController.java * @package: com.yingda.xsignal.test * @description: webSocket控制器 * @date 2018/3/30 0030 下午 7:04 */ @RestController @EnableScheduling public class WebSocketController {private Logger logger = LoggerFactory.getLogger(getClass()); /** * 當瀏覽器向服務端發送請求時,通過@MessageMapping映射/sendTest這個地址,類似于@ResponseMapping * 當服務器有消息時,會對訂閱了@SendTo中的路徑的瀏覽器發送消息 * * @param message * @return */ @MessageMapping("/sendTest")@SendTo("/topic/responseTest")public String say(String message) {try {//睡眠1 Thread.sleep(1000); } catch (InterruptedException e) {e.printStackTrace(); }return message; } @SubscribeMapping("/topic/responseTest")public String sub() {logger.info("X用戶訂閱了"); return "thanks for your subscribe!"; }@Autowired WebSocketTemplate webSocketTemplate; /** * 模擬服務端推送數據(注:必須在同一個服務內,否則無法進行訂閱推送) */ @Scheduled(fixedRate = 2000)public void task() {webSocketTemplate.sendMessage("服務器端推送~" + UUID.randomUUID()); }}


WebSocketTemplate:

/** * @author xiaofeng * @version V1.0 * @title: WebSocketTemplate.java * @package: com.yingda.xsignal.test.websocket.send * @description: webSocket發送模板 * @date 2018/3/30 0030 下午 3:57 */ @Component public class WebSocketTemplate {private SimpMessagingTemplate messagingTemplate; @Autowired public WebSocketTemplate(SimpMessagingTemplate messagingTemplate) {this.messagingTemplate = messagingTemplate; }/** * 向訂閱了 /topic/responseTest 客戶端websocket實例發送數據 * * @param message */ public void sendMessage(String message) {AricMessage aricMessage = new AricMessage(); aricMessage.setName(message); messagingTemplate.convertAndSend("/topic/responseTest", aricMessage); } }

5.在resources -> templates中創建html文件

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>SpringBoot 服務端推送消息</title> <script src="http://cdn.bootcss.com/sockjs-client/1.1.1/sockjs.min.js"></script> <script src="http://cdn.bootcss.com/stomp.js/2.3.3/stomp.js"></script> <script src="http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script> </head> <body> <div> <div> <button id="connect" οnclick="connect();">connect</button> <button id="disconnect" disabled="disabled" οnclick="disconnect();">disconnect</button> </div> <div id="conversationDiv"> <div id="response"></div> </div> </div> </body> <script type="text/javascript"> var stompClient = null; 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('/endpointTest'); //連接SockJSendpoint名稱為"endpointTest" stompClient = Stomp.over(socket);//使用STMOP子協議的WebSocket客戶端 stompClient.connect({},function(frame){//連接WebSocket服務端 setConnected(true); console.log('Connected:' + frame); //通過stompClient.subscribe訂閱/topic/responseTest 目標(destination)發送的消息,這個是在控制器的@SentTo中定義的 stompClient.subscribe('/topic/responseTest',function(response){showResponse(JSON.parse(response.body).name); }); }); }function disconnect(){if(stompClient != null) {stompClient.disconnect(); }setConnected(false); console.log("Disconnected"); }function showResponse(message){var response = $("#response"); response.html(message); } </script> </html>

啟動服務,測試,點擊connect,發現每隔幾秒隨機字符串都會發生變化,說明后臺服務一直在向前端推送數據


ok,至此我們的springboot集成websocket并向前端推送數據成功,congratulation!

總結

以上是生活随笔為你收集整理的springboot 之 webscoket 服务端推送的全部內容,希望文章能夠幫你解決所遇到的問題。

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