SpringBoot使用WebSocket實現(xiàn)前后端交互的操作方法
背景
我們都知道http協(xié)議只能在瀏覽器單方面向服務器發(fā)起請求時獲得響應,然而服務器不能主動向瀏覽器推送消息,想要實現(xiàn)瀏覽器的主動推送目前有兩種主流的實現(xiàn)方式:
- 輪詢:缺點很多,但是實現(xiàn)簡單
- websocket: 在瀏覽器和服務器之間建立TCP連接,實現(xiàn)全雙工通信
- springboot使用websocket有兩種方式,一種是實現(xiàn)簡單的websocket,另外一種是實現(xiàn)STOMP協(xié)議。本篇講述如何使用springboot實現(xiàn)簡單的websocket。
實現(xiàn)
一、導入依賴
直接在pom.xml
中導入依賴。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
二、新建WebSocket配置類,注入Bean
首先注入一個ServerEndpointExporterBean,該Bean會自動注冊使用@ServerEndpoint注解申請的websocket endpoint,代碼如下:
@Component public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter(){ return new ServerEndpointExporter(); } }
三、新建WebSocket服務端,在其中處理websocket邏輯
@Component //注冊到容器中 @ServerEndpoint("/webSocket") //接收websocket請求路徑 @Slf4j public class WebSocket { //當前連接(每個websocket連入都會創(chuàng)建一個WebSocket實例) private Session session; //定義一個websocket容器存儲session,即存放所有在線的socket連接 private static CopyOnWriteArraySet<WebSocket> webSocketSet = new CopyOnWriteArraySet<>(); //處理連接建立 @OnOpen public void opOpen(Session session){ this.session = session; log.info("【有新的客戶端連接了】:{}",session.getId()); webSocketSet.add(this); //將新用戶加入在線組 log.info("【websocket消息】有新的連接,總數(shù):{}",webSocketSet.size()); } //處理連接關(guān)閉 @OnClose public void Onclose(){ webSocketSet.remove(this); log.info("【websocket消息】連接斷開,總數(shù):{}",webSocketSet.size()); //接受消息 @OnMessage public void onMessage(String message){ log.info("【websocket消息】收到客戶端發(fā)來的消息:{}",message); // 群發(fā)消息 public void sendMessage(String message) { for (WebSocket webSocket : webSocketSet) { log.info("【websocket消息】廣播群發(fā)消息,message={}",message); try { webSocket.session.getBasicRemote().sendText(message); }catch (Exception e){ e.printStackTrace(); } } }
四、客戶端實現(xiàn),可以借助FreeMarker模板工具直接寫在ftl文件里。
由于部分瀏覽器可能不支持,可以先測試,代碼如下:
<script> var websocket = null; if('WebSocket' in window){ websocket = new WebSocket('ws://localhost:8080/webSocket'); }else{ alert('當前瀏覽器不支持websocket消息通知'); } //連接成功建立的回調(diào)方法 websocket.onopen = function (event) { console.log("ws建立連接成功"); //連接關(guān)閉的回調(diào)方法 websocket.onclose = function (event) { console.log("ws連接關(guān)閉"); //接收到消息的回調(diào)方法 websocket.onmessage = function (event) { /*setMessageInnerHTML(event.data);*/ // alert("ws接收返回消息:"+event.data); console.log("服務器返回消息: " + event.data); //彈窗提醒(要用到JQuary,所以要先引入JQuary) 播放音樂 $('#mymodal').modal('show') //連接發(fā)生錯誤的回調(diào)方法 websocket.onerror = function(event){ alert('websocket通信發(fā)生錯誤!') //監(jiān)聽窗口關(guān)閉事件,當窗口關(guān)閉時,主動去關(guān)閉websocket連接,防止連接還沒斷開就關(guān)閉窗口,server端會拋異常。 window.onbeforeunload = function() { websocket.close(); </script>
五、測試
(項目實現(xiàn)客戶創(chuàng)建新訂單之后,前臺發(fā)出提醒)
@Autowired private WebSocket webSocket; @Override @Transactional public OrderDTO create(OrderDTO orderDTO) {//創(chuàng)建訂單 。。。。(具體代碼省略) //創(chuàng)建新訂單 發(fā)送websocket消息 webSocket.sendMessage(orderDTO.getOrderId()); return orderDTO; }
添加新訂單:
接收到websocket消息
到此這篇關(guān)于SpringBoot使用WebSocket實現(xiàn)前后端交互的操作方法的文章就介紹到這了,更多相關(guān)SpringBoot前后端交互內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基礎(chǔ)之創(chuàng)建虛擬機對象的過程詳細總結(jié)
本文基于虛擬機HotSpot和常用的內(nèi)存區(qū)域Java堆深入對象分配、布局和訪問的全過程,文中有非常詳細的圖文解說,對正在學習java的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05Java JDK動態(tài)代理(AOP)的實現(xiàn)原理與使用詳析
所謂代理,就是一個人或者一個機構(gòu)代表另一個人或者另一個機構(gòu)采取行動。下面這篇文章主要給大家介紹了關(guān)于Java JDK動態(tài)代理(AOP)實現(xiàn)原理與使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-07-07springboot實現(xiàn)通過路徑從磁盤直接讀取圖片
這篇文章主要介紹了springboot實現(xiàn)通過路徑從磁盤直接讀取圖片,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03基于Spring-cloud-gateway實現(xiàn)全局日志記錄的方法
最近項目在線上運行出現(xiàn)了一些難以復現(xiàn)的bug需要定位相應api的日志,通過nginx提供的api請求日志難以實現(xiàn),于是在gateway通過全局過濾器記錄api請求日志,本文給大家介紹基于Spring-cloud-gateway實現(xiàn)全局日志記錄,感興趣的朋友一起看看吧2023-11-11