国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

WebSocket實(shí)現(xiàn)后端數(shù)據(jù)變化,通知前端實(shí)時(shí)更新數(shù)據(jù)

這篇具有很好參考價(jià)值的文章主要介紹了WebSocket實(shí)現(xiàn)后端數(shù)據(jù)變化,通知前端實(shí)時(shí)更新數(shù)據(jù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

背景

? 項(xiàng)目中需要做一個(gè)消息提示功能,當(dāng)有用戶(hù)處理相關(guān)待辦信息后,別的用戶(hù)需要實(shí)時(shí)更新處理后的待辦信息。

解決方案:

? 1、使用最原始的方法,寫(xiě)個(gè)定時(shí)器去查詢(xún)待辦信息。但這種方式在大多數(shù)情況是不被允許的,它會(huì)浪費(fèi)系統(tǒng)中的許多資源,同時(shí)也并不是完全意義上的實(shí)時(shí)更新。

? 2、使用WebSocket通信技術(shù)去實(shí)現(xiàn)一個(gè)實(shí)時(shí)更新,它可以實(shí)現(xiàn)廣播和私信的模式。當(dāng)一個(gè)用戶(hù)與WebSocket服務(wù)建立連接后,用戶(hù)可以給它發(fā)送一個(gè)消息,此時(shí)WebSocket服務(wù)會(huì)接收到這個(gè)消息并做出回信(此時(shí)可以回信給所有與其建立連接的用戶(hù)——廣播,也可以回信給指定用戶(hù)——私信)。接下來(lái)將從前后端去講解WebSocket的使用。

一、WebSocket服務(wù)的搭建(SpringBoot后端)

SpringBoot自帶的WebSocket有以下5個(gè)注解需要注意:

  1. @ServerEndpoint

    暴露出的ws應(yīng)用的路徑,支持RESTful風(fēng)格傳參,類(lèi)似/websocket/{username}

  2. @OnOpen

    與當(dāng)前客戶(hù)端連接成功,有入?yún)ession對(duì)象(當(dāng)前連接對(duì)象),同時(shí)可以利用@PathParam()獲取上述應(yīng)用路徑中傳遞的參數(shù),比如@PathParam(“username”) String username。

  3. @OnClose

    與當(dāng)前客戶(hù)端連接失敗,有入?yún)ession對(duì)象(當(dāng)前連接對(duì)象),同時(shí)也可以利用@PathParam()獲取上述應(yīng)用路徑中傳遞的參數(shù)。

  4. @OnError

    與當(dāng)前客戶(hù)端連接異常,有入?yún)ession對(duì)象(當(dāng)前連接對(duì)象)、Throwable對(duì)象(異常對(duì)象),同時(shí)也可以利用@PathParam()獲取上述應(yīng)用路徑中傳遞的參數(shù)。

  5. @OnMessage

    當(dāng)前客戶(hù)端發(fā)送消息,有入?yún)ession對(duì)象(當(dāng)前連接對(duì)象)、String message對(duì)象(當(dāng)前客戶(hù)端傳遞過(guò)來(lái)的字符串消息)

1、引入所需依賴(lài)
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2、使用自定義類(lèi)開(kāi)啟WebSocket
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * @program: webSocketTest
 * @description: WebSocket相關(guān)配置
 * @author: 黃珺瑜
 * @create: 2022-06-30 16:24
 **/

@Configuration
@EnableWebSocket
public class WebSocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }

}
3、配置WebSocket服務(wù)
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @program: webSocketTest
 * @description: WebSocket服務(wù)
 * @author: 黃珺瑜
 * @create: 2022-06-30 16:25
 **/

@Component
@Slf4j
@ServerEndpoint("/websocket") //暴露的ws應(yīng)用的路徑
public class WebSocket {

    // 用來(lái)存儲(chǔ)服務(wù)連接對(duì)象
    private static Map<String ,Session> clientMap = new ConcurrentHashMap<>();

    /**
     * 客戶(hù)端與服務(wù)端連接成功
     * @param session
     */
    @OnOpen
    public void onOpen(Session session){
        /*
            do something for onOpen
            與當(dāng)前客戶(hù)端連接成功時(shí)
         */
        clientMap.put(session.getId(),session);
    }

    /**
     * 客戶(hù)端與服務(wù)端連接關(guān)閉
     * @param session
     */
    @OnClose
    public void onClose(Session session){
        /*
            do something for onClose
            與當(dāng)前客戶(hù)端連接關(guān)閉時(shí)
         */
        clientMap.remove(session.getId());
    }

    /**
     * 客戶(hù)端與服務(wù)端連接異常
     * @param error
     * @param session
     */
    @OnError
    public void onError(Throwable error,Session session) {
        error.printStackTrace();
    }

    /**
     * 客戶(hù)端向服務(wù)端發(fā)送消息
     * @param message
     * @throws IOException
     */
    @OnMessage
    public void onMsg(Session session,String message) throws IOException {
        /*
            do something for onMessage
            收到來(lái)自當(dāng)前客戶(hù)端的消息時(shí)
         */
        sendAllMessage(message);
    }

    //向所有客戶(hù)端發(fā)送消息(廣播)
    private void sendAllMessage(String message){
        Set<String> sessionIdSet = clientMap.keySet(); //獲得Map的Key的集合
        // 此處相當(dāng)于一個(gè)廣播操作
        for (String sessionId : sessionIdSet) { //迭代Key集合
            Session session = clientMap.get(sessionId); //根據(jù)Key得到value
            session.getAsyncRemote().sendText(message); //發(fā)送消息給客戶(hù)端
        }
    }
}

二、與WebSocket服務(wù)建立連接(Vue前端)

WebSocket是js自帶的一個(gè)對(duì)象,所以此處不需要任何引入第三方依賴(lài)包的操作。

WebSocket對(duì)象講解:

  1. 創(chuàng)建WebSocket對(duì)象

    const ws = new WebSocket('ws://127.0.0.1:8088/websocket')
    // WebSocket服務(wù)的建立需要使用ws協(xié)議或者wss協(xié)議
    
  2. onopen事件監(jiān)聽(tīng)

    // 建立連接后的回調(diào)函數(shù)
    openCallback(e){
        console.log('與服務(wù)端連接打開(kāi)->',e)
    }
    
  3. onerror事件監(jiān)聽(tīng)

    // 連接異常后的回調(diào)函數(shù)
    errorCallback(e){
        console.log('與服務(wù)端連接打開(kāi)->',e)
    }
    
  4. onclose事件監(jiān)聽(tīng)

    // 關(guān)閉連接的回調(diào)函數(shù)
    closeCallback(e){
        console.log('與服務(wù)端連接打開(kāi)->',e)
    }
    
  5. onmessage事件監(jiān)聽(tīng)

    // 接收到服務(wù)端的回信后的回調(diào)函數(shù)
    messageCallback(e){
        console.log('與服務(wù)端連接打開(kāi)->',e)
    }
    
1、包裝后的webSocket.js
/**
 * 參數(shù)說(shuō)明:
 *  webSocketURL:String    webSocket服務(wù)地址    eg: ws://127.0.0.1:8088/websocket (后端接口若為restful風(fēng)格可以帶參數(shù))  
 *  callback:為帶一個(gè)參數(shù)的回調(diào)函數(shù)
 *  message:String 要傳遞的參數(shù)值(不是一個(gè)必要的參數(shù))
 */
export default{
    // 初始化webSocket
    webSocketInit(webSocketURL){      // ws://127.0.0.1:8088/websocket
        this.webSocket = new WebSocket(webSocketURL);
        this.webSocket.onopen = this.onOpenwellback;
        this.webSocket.onmessage = this.onMessageCallback;
        this.webSocket.onerror = this.onErrorCallback;
        this.webSocket.onclose = this.onCloseCallback;
    },

    // 自定義回調(diào)函數(shù)
    setOpenCallback(callback){ //  與服務(wù)端連接打開(kāi)回調(diào)函數(shù)
        this.webSocket.onopen = callback;
    },
    setMessageCallback(callback){   //  與服務(wù)端發(fā)送消息回調(diào)函數(shù)
        this.webSocket.onmessage = callback;
    },
    setErrorCallback(callback){ //  與服務(wù)端連接異常回調(diào)函數(shù)
        this.webSocket.onerror = callback;
    },
    setCloseCallback(callback){ //  與服務(wù)端連接關(guān)閉回調(diào)函數(shù)
        this.webSocket.onclose = callback;
    },

    close(){    // 關(guān)閉連接
        this.webSocket.close();
    },
    sendMessage(message){   // 發(fā)送消息函數(shù)
        this.webSocket.send(message);
    },
}
2、Vue中WebSocket對(duì)象的使用
<template>
  <el-button type="primary" @click="sendMessage">發(fā)送消息</el-button>
</template>

<script>
import webSocket from '@/api/evgis/webSocket'
export default {
    name:"WebSocketTest",
    data(){
        return{
            webSocketObject: null,
        }
    },
    created() {
        // webSocket.webSocketInit(process.env.VUE_APP_BASE_API.replace("http","ws")+"/evgis/todoStatus")
        webSocket.webSocketInit('ws://127.0.0.1:8088/websocket')	//初始化webSocket
        // 按需進(jìn)行綁定回調(diào)函數(shù)
        webSocket.setOpenCallback(res=>{
            console.log("連接建立成功",res);
        })
        webSocket.setMessageCallback(res=>{	
            // 在此處進(jìn)行數(shù)據(jù)刷新操作即可實(shí)現(xiàn)數(shù)據(jù)發(fā)生改變時(shí)實(shí)時(shí)更新數(shù)據(jù)
            console.log("接收到回信",res);
        })
        webSocket.setErrorCallback(res=>{
            console.log("連接異常",res);
        })
        webSocket.setCloseCallback(res=>{
            console.log("連接關(guān)閉",res);
        })
    },
    methods:{
        sendMessage(){
            // 數(shù)據(jù)發(fā)生改變時(shí)給WebSocket發(fā)送消息,讓其進(jìn)行廣播操作
            webSocket.sendMessage();
        }
    }
}
</script>

<style>
</style>

三、實(shí)踐時(shí)遇到困難

1、由于使用的時(shí)若依框架,配置好WebSocket服務(wù)后需要開(kāi)放出ws的服務(wù)地址,否則會(huì)提示未帶token,WebSocket連接不上。
2、在配置WebSocket服務(wù)時(shí),沒(méi)有在關(guān)閉連接方法中移除連接對(duì)象。導(dǎo)致建立WebSocket連接后一發(fā)送消息就斷開(kāi)連接。

參考文章:前后端使用利用WebSocket進(jìn)行通信、服務(wù)器推送消息到前端實(shí)現(xiàn)頁(yè)面數(shù)據(jù)實(shí)時(shí)刷新-分布式Websocket技術(shù)方案文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-852288.html

到了這里,關(guān)于WebSocket實(shí)現(xiàn)后端數(shù)據(jù)變化,通知前端實(shí)時(shí)更新數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 前端大屏數(shù)據(jù)實(shí)時(shí)更新

    在頁(yè)面中使用? setInterval ?每隔幾秒去獲取一下數(shù)據(jù)。偽代碼如下: 一般不建議這樣使用,因?yàn)闀?huì)給頁(yè)面造成性能問(wèn)題。 使用? websocket 如果使用 websocket 純前端無(wú)法獨(dú)立完成,需要 后臺(tái) ?配合提供相應(yīng)的接口。 使用 SSE(Server-Sent Events) , 純前端無(wú)法獨(dú)立完成,需要 后臺(tái) ?配

    2024年02月05日
    瀏覽(24)
  • uniapp:實(shí)現(xiàn)手機(jī)端APP登錄強(qiáng)制更新,從本地服務(wù)器下載新的apk更新,并使用WebSocket,實(shí)時(shí)強(qiáng)制在線(xiàn)用戶(hù)更新

    uniapp:實(shí)現(xiàn)手機(jī)端APP登錄強(qiáng)制更新,從本地服務(wù)器下載新的apk更新,并使用WebSocket,實(shí)時(shí)強(qiáng)制在線(xiàn)用戶(hù)更新

    實(shí)現(xiàn)登錄即更新,或?qū)崟r(shí)監(jiān)聽(tīng)更新 本文介紹的是在 App打開(kāi)啟動(dòng) 的時(shí)候調(diào)用更新,點(diǎn)擊下方鏈接,查看使用 WebSocket 實(shí)現(xiàn) 實(shí)時(shí) 通知 在線(xiàn)用戶(hù) 更新。 uniapp:全局消息是推送,實(shí)現(xiàn)app在線(xiàn)更新,WebSocket,apk上傳: 背景 :內(nèi)部手持機(jī)app開(kāi)發(fā)功能,需要更新的到車(chē)間各個(gè)手持機(jī)上。

    2024年02月03日
    瀏覽(25)
  • Thinkphp5.0 安裝使用Workerman實(shí)現(xiàn)websocket前后端通信,后端主動(dòng)推送消息到前端

    安裝使用Workerman實(shí)現(xiàn)websocket前后端通信,后端主動(dòng)推送消息到前端,實(shí)現(xiàn)后端有數(shù)據(jù)更新時(shí),前端頁(yè)面自動(dòng)更新數(shù)據(jù)。 我使用的是基于Thinkphp5.0的ThinkCMF5.0。 安裝: 啟動(dòng): public目錄下放置的server.php文件,注意里面的配置必須按照你的Worker控制器來(lái): woker控制器: 后端主動(dòng)推

    2024年02月16日
    瀏覽(32)
  • 數(shù)據(jù)大屏--->前端實(shí)時(shí)更新數(shù)據(jù)的幾種方式

    數(shù)據(jù)大屏--->前端實(shí)時(shí)更新數(shù)據(jù)的幾種方式

    優(yōu)點(diǎn):最大的優(yōu)點(diǎn)就是實(shí)現(xiàn)簡(jiǎn)單 缺點(diǎn):(1)無(wú)用的請(qǐng)求多,客戶(hù)端不知道服務(wù)端什么時(shí)候數(shù)據(jù)更新,只能不停的向服務(wù)端發(fā)送請(qǐng)求, (2)數(shù)據(jù)實(shí)時(shí)性差:客戶(hù)端還是需要一段時(shí)間(3s)才能拿到最新的數(shù)據(jù) 優(yōu)點(diǎn):解決了短輪詢(xún)每隔幾秒向服務(wù)端頻繁發(fā)送請(qǐng)求的問(wèn)題; 缺點(diǎn):(1)服務(wù)端資源大量消

    2024年04月17日
    瀏覽(29)
  • Vue使用WebSocket實(shí)現(xiàn)實(shí)時(shí)獲取后端推送的數(shù)據(jù)。

    Vue可以使用WebSocket實(shí)現(xiàn)實(shí)時(shí)獲取后端推送的數(shù)據(jù)。 1.在Vue項(xiàng)目中安裝WebSocket庫(kù) 可以使用npm或yarn安裝WebSocket庫(kù): 2.創(chuàng)建WebSocket連接 在Vue組件中創(chuàng)建WebSocket連接,連接到后端WebSocket服務(wù)器,代碼如下: 上面的代碼中,使用WebSocket連接到后端WebSocket服務(wù)器,通過(guò)監(jiān)聽(tīng)onmessage事件,

    2024年02月08日
    瀏覽(26)
  • 實(shí)時(shí)數(shù)據(jù)流無(wú)憂(yōu):用 SpringBoot 和 SSE 打造動(dòng)態(tài)前端更新的終極指南

    你知道什么是開(kāi)發(fā)者的夢(mèng)魘嗎?慢!慢!慢!在一個(gè)需要實(shí)時(shí)數(shù)據(jù)更新的應(yīng)用中,如果數(shù)據(jù)像烏龜一樣慢吞吞地爬行,那用戶(hù)體驗(yàn)就會(huì)像坐過(guò)山車(chē)一樣直線(xiàn)下降。所以今天,我們要化身為數(shù)據(jù)傳輸?shù)某?jí)英雄,用 SpringBoot 和 SSE(服務(wù)器發(fā)送事件)打造一個(gè)超酷、超快、而且超

    2024年02月02日
    瀏覽(25)
  • WebSocket 網(wǎng)絡(luò)協(xié)議(實(shí)時(shí)更新 )

    WebSocket 網(wǎng)絡(luò)協(xié)議(實(shí)時(shí)更新 )

    WebSocket 是一種在客戶(hù)端和服務(wù)器之間建立雙向通信信道的網(wǎng)絡(luò)協(xié)議。它在客戶(hù)端和服務(wù)器之間建立一個(gè)持久的、全雙工的連接,允許數(shù)據(jù)在兩個(gè)方向上實(shí)時(shí)傳輸,而不需要像HTTP一樣進(jìn)行多次請(qǐng)求和響應(yīng)。 ?WebSocket 的主要優(yōu)勢(shì)是減少了服務(wù)器和客戶(hù)端之間的通信延遲,因?yàn)閿?shù)

    2024年01月17日
    瀏覽(24)
  • 前端訂閱后端推送WebSocket定時(shí)任務(wù)

    前端訂閱后端推送WebSocket定時(shí)任務(wù)

    ? ? ? ? 后端定時(shí)向前端看板推送數(shù)據(jù),每10秒或者30秒推送一次。 ????????HTTP協(xié)議是一個(gè)應(yīng)用層協(xié)議,它的特點(diǎn)是無(wú)狀態(tài)、無(wú)連接和單向的。在HTTP協(xié)議中,客戶(hù)端發(fā)起請(qǐng)求,服務(wù)器則對(duì)請(qǐng)求進(jìn)行響應(yīng)。這種請(qǐng)求-響應(yīng)的模式意味著服務(wù)器無(wú)法主動(dòng)向客戶(hù)端發(fā)送消息。 ??

    2024年04月25日
    瀏覽(21)
  • Java使用websocket實(shí)現(xiàn)消息實(shí)時(shí)通知

    博客僅做學(xué)習(xí)記錄使用。 做項(xiàng)目中遇到這樣一個(gè)實(shí)時(shí)通知需求,因?yàn)榈谝淮谓佑|這個(gè),期間查了很多資料,看了很多博客,最后實(shí)現(xiàn)功能,查詢(xún)的博客太多,就不一一放出來(lái)了,感謝各位大佬。 websocket方式主要代碼來(lái)源于這個(gè)大佬的博客: https://blog.csdn.net/moshowgame/article/d

    2024年02月08日
    瀏覽(31)
  • Python Flask 后端向前端推送信息——輪詢(xún)、SSE、WebSocket

    Python Flask 后端向前端推送信息——輪詢(xún)、SSE、WebSocket

    后端向前端推送信息,通知任務(wù)完成 輪詢(xún) SSE WebSocket 請(qǐng)求方式 HTTP HTTP TCP長(zhǎng)連接 觸發(fā)方式 輪詢(xún) 事件 事件 優(yōu)點(diǎn) 實(shí)現(xiàn)簡(jiǎn)單易兼容 實(shí)現(xiàn)簡(jiǎn)單開(kāi)發(fā)成本低 全雙工通信,開(kāi)銷(xiāo)小,安全,可擴(kuò)展 缺點(diǎn) 消耗較大 不兼容IE 傳輸數(shù)據(jù)需二次解析,開(kāi)發(fā)成本大 適用場(chǎng)景 服務(wù)端向客戶(hù)端單向

    2023年04月19日
    瀏覽(51)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包