欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot使用WebSocket實現(xiàn)前后端交互的操作方法

 更新時間:2022年04月07日 15:02:36   作者:heaven096  
springboot使用websocket有兩種方式,一種是實現(xiàn)簡單的websocket,另外一種是實現(xiàn)STOMP協(xié)議,本篇講述如何使用springboot實現(xiàn)簡單的websocket,需要的朋友可以參考下

背景

我們都知道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)文章

  • Spring輕松解決循環(huán)依賴

    Spring輕松解決循環(huán)依賴

    Spring的解決循環(huán)依賴是有前置條件的,要解決循環(huán)依賴我們首先要了解Spring Bean對象的創(chuàng)建過程和依賴注入的方式。依賴注入方式,我之前的博客有所分享,大家可以在看本篇文章之前進行一下小小的回顧
    2023-04-04
  • Redisson分布式鎖的原理和代碼實例

    Redisson分布式鎖的原理和代碼實例

    這篇文章主要介紹了Redisson分布式鎖的原理和代碼實例,在分布式系統(tǒng)中,鎖機制是非常重要的,Redisson是一個基于Redis的Java應用程序,常常被應用作為分布式鎖的解決方案,需要的朋友可以參考下
    2024-01-01
  • 使用Pinyin4j進行拼音分詞的方法

    使用Pinyin4j進行拼音分詞的方法

    下面小編就為大家分享一篇使用Pinyin4j進行拼音分詞的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Java基礎(chǔ)之創(chuàng)建虛擬機對象的過程詳細總結(jié)

    Java基礎(chǔ)之創(chuàng)建虛擬機對象的過程詳細總結(jié)

    本文基于虛擬機HotSpot和常用的內(nèi)存區(qū)域Java堆深入對象分配、布局和訪問的全過程,文中有非常詳細的圖文解說,對正在學習java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Java異常處理的五個關(guān)鍵字

    Java異常處理的五個關(guān)鍵字

    本篇文章給大家詳細講述了關(guān)于Java異常處理的相關(guān)知識點,并列舉了5個重要關(guān)鍵字,一起啊參考學下。
    2018-03-03
  • Java JDK動態(tài)代理(AOP)的實現(xiàn)原理與使用詳析

    Java JDK動態(tài)代理(AOP)的實現(xiàn)原理與使用詳析

    所謂代理,就是一個人或者一個機構(gòu)代表另一個人或者另一個機構(gòu)采取行動。下面這篇文章主要給大家介紹了關(guān)于Java JDK動態(tài)代理(AOP)實現(xiàn)原理與使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • java的正則表達式你知道多少

    java的正則表達式你知道多少

    這篇文章主要為大家詳細介紹了java的正則表達式,使用表格進行介紹,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • springboot實現(xiàn)通過路徑從磁盤直接讀取圖片

    springboot實現(xiàn)通過路徑從磁盤直接讀取圖片

    這篇文章主要介紹了springboot實現(xiàn)通過路徑從磁盤直接讀取圖片,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 基于Spring-cloud-gateway實現(xiàn)全局日志記錄的方法

    基于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
  • java 異常之手動拋出與自動拋出的實例講解

    java 異常之手動拋出與自動拋出的實例講解

    這篇文章主要介紹了java 異常之手動拋出與自動拋出的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評論