vue項目中使用websocke即時通訊實現系統公告實時獲取并提醒

一、使用場景
發布者設置需要發布的公告內容、公告接收用戶和發布時間,到達發布時間時及時通知提醒已登錄系統用戶,使用websocke來實現前端與服務器保持長連接,以便實時過去公告信息。
在這里插入圖片描述
在這里插入圖片描述

  • WebSocket是一種在單個TCP連接上進行全雙工通信的協議。這種協議使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。WebSocket基于TCP傳輸協議,并且復用HTTP的握手通道,即基于HTTP的"keep-alive"機制,允許在一次TCP連接中傳送多個HTTP請求和響應。
  • WebSocket的通信過程大致如下:在建立WebSocket連接時,客戶端會向服務器發送一個HTTP請求報文,其中包含升級協議的請求頭。服務器在接收到該請求后會返回一個HTTP響應報文,其中包含升級協議的響應頭。在收到服務器的響應后,客戶端和服務器之間的連接就會升級為WebSocket連接,此時客戶端和服務器之間的通信就不再需要使用HTTP協議的請求和響應報文,而是直接進行雙向數據傳輸。
  • WebSocket協議的特點包括: 較少的控制開銷:在連接創建后,服務器和客戶端之間交換數據時,用于協議控制的數據包頭部相對較小。
  • 更強的實時性:由于協議是全雙工的,所以服務器可以隨時主動給客戶端下發數據。
  • 保持連接狀態:與HTTP不同的是,WebSocket需要先創建連接,這就使得其成為一種有狀態的協議,之后通信時可以省略部分狀態信息。
  • 更好的二進制支持:WebSocket定義了二進制幀,相對HTTP,可以更輕松地處理二進制內容。
  • 可以支持擴展:WebSocket定義了擴展,用戶可以擴展協議、實現部分自定義的子協議。
  • 與HTTP長連接相比,WebSocket連接在數據傳輸效率和實時性方面具有明顯優勢。HTTP長連接中,每次數據交換除了真正的數據部分外,服務器和客戶端還要大量交換HTTP
    header,消息交換效率低。而WebSocket連接在建立后,可以直接進行雙向數據傳輸,無需反復建立連接和發送HTTP請求,從而大大提高了數據傳輸效率和實時性。
  • 總之,WebSocket是一種高效、實時的全雙工通信協議,適用于需要實時通信和數據傳輸的場景。

二、實現過程

  1. 封裝自定義websocket服務
import config from "./config"/** 自定義websocket服務 */
export default class SocketService {/*** 單例*/static instance = nullstatic get Instance() {if (!this.instance) {this.instance = new SocketService()}return this.instance}/** 和服務端連接的socket對象 */ws = null/** 服務器連接地址 */wsUrl = null/** 連接用戶Id */userId = null/** 存儲回調函數 */callBackMapping = {}/** 標識是否連接成功 */connected = false/** 重新連接間隔(ms) */connectRetryTime = 3000/** 重新連接次數 */connectRetryCount = 0/** 定義連接服務器的方法 */connect(_userId) {// 連接服務器if (!window.WebSocket) {return console.log('您的瀏覽器不支持WebSocket')}// // =============環境判斷===============this.userId = _userId;if (process.env.NODE_ENV == 'development') {this.wsUrl = config.development_config.wsUrl + _userId + ':' + Date.now();}else if (process.env.NODE_ENV == 'debug') {this.wsUrl = config.development_config.wsUrl + _userId + ':' + Date.now();}else if (process.env.NODE_ENV == 'production') {this.wsUrl = config.production_config.wsUrl + _userId + ':' + Date.now();}this.ws = new WebSocket(this.wsUrl)// 連接成功的事件this.ws.onopen = () => {console.log('Socket連接服務端成功,您的連接地址:' + this.wsUrl);this.connected = true// 重置重新連接的次數this.connectRetryCount = 0}// 1.連接服務端失敗// 2.當連接成功之后, 服務器關閉的情況this.ws.onclose = () => {console.log('連接服務端失敗')this.connected = falsethis.connectRetryCount++if (this.connectRetryCount >= 10) {console.log('Socket出錯,已斷開連接');}else{console.log('Socket出錯:第' + this.connectRetryCount + '次重新連接嘗試!')this.connect(this.userId);}}}
}
  1. 在用戶登錄成功后建立連接,App.vue中也要建立連接(用戶刷新后要重新連接)
    login.vue
    login.vue
    App.vue
    在這里插入圖片描述
    main.js
    在這里插入圖片描述

  2. 對應通知頁面獲取數據并以彈框的形式渲染

/** 即時通訊相關參數 */im: {ws: null,messageList: [],message: {},},watch: {'im.message': {handler(newVal, oldVal) {if (newVal != oldVal) {console.log('message=>', newVal);this.notVisible = true;setTimeout(() => {this.notVisible = false;}, 10000);}},}},created() {// 檢測瀏覽器是否支持Websocketif (typeof WebSocket == 'undefined') {this.$alert('系統檢測到您的瀏覽器不支持Websocket通信協議,這將會導致您無法正常進行課堂互動!建議您更換瀏覽器進行觀看!', '警告', {confirmButtonText: '知道了',callback: () => { }});}else {this.im.ws = this.$socket.wsvar retry = setInterval(() => {if (this.im.ws == null) {this.im.ws = this.$socket.ws} else {this.initIM();clearInterval(retry)}}, 1000);}},/** 初始化即時通訊 */initIM() {var _this = this;// 接收消息// console.log(_this.im.ws);_this.im.ws.onmessage = function (event) {var message = JSON.parse(event.data);_this.im.message = message.data;// console.log(_this.im.message);}// 出現錯誤_this.im.ws.onerror = function (error) {_this.$message.error('即時通訊出現錯誤');console.log("即時通訊出現錯誤:", error);};},

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11560.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11560.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11560.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

調用Mertc的接口

概述 metaRTC5.0版本 API進行了重構,本篇文章將介紹webrtc傳輸調用流程和例子。 metaRTC5.0版本提供了C和純C兩種接口。 ICE設置 iceCandidateType參數可以在配置文件yang_config.ini中配置,也可以在程序中賦值。 iceCandidateType0 //0:host 1:stun 2…

2024最新大廠C++面試真題合集,大廠面試百日沖刺 bay9

騰訊實習 指針常量和常量指針 常量指針(const Type* ptr):指針指向的內容不能被改變,但指針本身可以改變指向。 指針常量(Type* const ptr):指針自身的值即內存地址不能改變,但指向…

draw.io 網頁版二次開發(1):源碼下載和環境搭建

目錄 一 說明 二 源碼地址以及下載 三 開發環境搭建 1. 前端工程地址 2. 配置開發環境 (1)安裝 node.js (2)安裝 serve 服務器 3. 運行 四 最后 一 說明 應公司項目要求,需要對draw.io進行二次開發&…

電商后臺的秘密:通過API接口提取商品信息

在電子商務的運營中,后臺管理是核心環節,而API接口則是高效管理商品信息的關鍵。API允許商家直接與電商平臺的數據庫進行交互,實現數據的自動化提取和更新。 一、電商后臺管理的核心作用 電商后臺管理系統是商家進行商品展示、訂單處理、庫…

存儲過程、觸發器和函數

存儲過程、觸發器和函數在數據庫中具有重要的作用,它們可以帶來以下幾個方面的重要性: 數據一致性和完整性: 觸發器和存儲過程可以用于實現數據一致性和完整性約束。通過在數據庫操作(如插入、更新、刪除)發生時自動執…

盛最多水的容器(雙指針)

解題思路: 1,暴力解法(超時) 我們可以使用兩層for循環進行遍歷。找到那個最大的面積即可,這里我就不寫代碼了,因為寫了也是超時。 2,雙指針法 先定義兩個指針一個在最左端,一個在…

C++ 派生類的引入與特性

一 繼承與派生 從上面的例子可以看出: 繼承:一旦指定了某種事物父代的本質特征,那么它的子代將會自動具有哪些性質。這就是一種樸素的可重用的概念。 派生:而且子代可以擁有父代沒有的特性,這是可擴充的概念。 1 C 的…

Today At Apple 2024.04.15 Phone15 入門

官網: https://www.apple.com/today/Apple 亞洲第一大商店:Apple 靜安零售店現已在上海開幕如下預約課程:下載 Apple Store(不是app store),點擊課程預約筆記:Today At Apple Notes果粉加群 &am…

Mybatis進階詳細用法

目錄 條件構造器 案例 自定義SQL 案例 Service接口 案例 綜合案例 條件構造器 案例 Testvoid testQueryMapper() {// 創建 QueryWrapper 實例QueryWrapper<User> queryWrapper new QueryWrapper<>();queryWrapper.select("id," "username,&…

uniapp經驗

uniapp-ts模版在前端/vue文件夾下 npx dcloudio/uvmlatest 安裝依賴 之后tsconfig.json會報錯&#xff0c;可以在tsconfig.json文件中"compilerOptions"配置項內添加"ignoreDeprecations": "5.0"&#xff0c;解決。 ### 編譯和運行 uni-app 項目…

Postman基礎功能-變量設置與使用

如果你因失去太陽而流淚&#xff0c;那你也將失去群星了。大家好&#xff0c;在 API 測試的廣袤世界中&#xff0c;Postman 猶如一座閃耀的燈塔&#xff0c;為我們指引著前行的方向。而其中的全局變量、集合變量和環境變量&#xff0c;更是如同隱藏的寶藏&#xff0c;蘊含著巨大…

以太網網絡變壓器型號

Hqst華強盛導讀&#xff1a;以太網網絡變壓器的型號通常由一系列數字和字母組成&#xff0c;其中包括以下信息&#xff1a; 額定電壓&#xff1a;表示變壓器的額定輸入和輸出電壓&#xff0c;通常以伏特&#xff08;V&#xff09;為單位。 額定電流&#xff1a;表示變壓器的額定…

0513_IO7

練習1&#xff1a; 使用消息隊列實現的2個終端之間的互相聊天 并使用信號控制消息隊列的讀取方式&#xff1a; 當鍵盤按ctrlc的時候&#xff0c;切換消息讀取方式&#xff0c;一般情況為讀取指定編號的消息&#xff0c;按ctrlc之后&#xff0c;指定的編號不讀取&#xff0c;讀取…

孩子多大可以接觸python?學習python的好處

孩子接觸Python的年齡并沒有明確的界限&#xff0c;一般來說&#xff0c;6歲以上的孩子可以開始學習Python編程。雖然Python是一門高級編程語言&#xff0c;但它的語法簡單易懂&#xff0c;適合初學者入門。通過學習Python編程&#xff0c;孩子可以培養邏輯思維、創造力和解決問…

電商秒殺系統設計

業務流程 系統架構 系統挑戰 高并發:秒殺活動會在短時間內吸引大量用戶,系統需要能夠處理高峰時期的大量并發請求 庫存同步:在秒殺中,面臨的一個嚴重系統挑戰是如何確保在數以萬計的用戶同時搶購有限的商品時,如何正確、實時地扣減庫存,以防止超賣現象。 防止惡意搶購和…

前端 JS 經典:JS 基礎類型和 typeof

前言&#xff1a;JS 基礎類型就 8 種&#xff0c;這是官方確定的&#xff0c;毋庸置疑。其中原始類型 7 種&#xff0c;對象類型 1 種。而 typeof 關鍵字是用來判斷數據是屬于什么類型的。 1. 原始類型 Number、Boolean、String、BigInt、symbol、Undefined、null typeof 18…

貓頭虎分享已解決Error || ERROR: Failed building wheel for XXX

博主貓頭虎的技術世界 &#x1f31f; 歡迎來到貓頭虎的博客 — 探索技術的無限可能&#xff01; 專欄鏈接&#xff1a; &#x1f517; 精選專欄&#xff1a; 《面試題大全》 — 面試準備的寶典&#xff01;《IDEA開發秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鴻蒙》 …

python設計模式---觀察者模式

觀察者模式是一種行為設計模式&#xff0c;用于定義對象之間的一對多依賴關系&#xff0c;當一個對象的狀態發生變化時&#xff0c;所有依賴它的對象都會得到通知并自動更新。 from abc import ABC, abstractmethod from typing import Listclass Observable:def __init__(sel…

系統定時器(SysTick)

介紹SysTick SysTick結構框圖 時鐘選擇 計數器部分 中斷部分 工作流程 相關寄存器 配置流程 相關庫函數

centos無法tab補全至文件

很奇怪的需求&#xff1a;redhat 7.9版本用cd 只能到目錄&#xff0c;無法到文件 我個人認為不是個問題&#xff0c;但是甲方需求&#xff0c;你懂的 首先&#xff0c;我們要搞清楚tab補全功能的包bash-completion是否安裝&#xff0c;這里肯定是安裝了&#xff0c;不過還是看…