前端WebSocket應用——聊天實時通信的基本配置

使用 WebSocket 實現實時通信的 Vue 應用
  • 前言
  • 1. WebSocketService 類
    • 1.1 類屬性
    • 1.2 構造函數和連接初始化
    • 1.3 WebSocket 連接
    • 1.4 事件處理方法
    • 1.5 發送和關閉 WebSocket 消息
    • 1.6 狀態查詢與回調注冊
    • 1.7 完整代碼
  • 2. 在 Vue 組件中使用 WebSocketService
    • 2.1 定義 WebSocket URL
    • 2.2 實例化 WebSocketService
    • 2.3 生命周期鉤子
  • 3. 總結

前言

在現代 Web 應用中,實時通信是提升用戶體驗的重要因素之一。WebSocket 協議提供了一種在客戶端和服務器之間建立持久連接的方式,使得雙向數據傳輸成為可能。本文將通過兩個代碼段,展示如何在 Vue 應用中使用 WebSocket 實現實時消息接收和發送。

1. WebSocketService 類

首先,我們定義一個 WebSocketService 類,用于管理 WebSocket 連接及其相關操作。以下是該類的實現:

1.1 類屬性

  • socket: WebSocket | null: 存儲 WebSocket 實例,用于與服務器進行實時通信。初始值為 null,在調用 connect() 方法時創建 WebSocket 實例。

  • count: number: 計數器,用于統計接收到的 WebSocket 消息的數量。每次接收到新消息時,計數器會自增。

  • token: string: 從用戶狀態中提取的令牌(token),用于認證。通過 useUserStore() 獲取用戶的 token 并保存下來,用于 WebSocket 的連接和認證。

  • isConnected: boolean: 表示 WebSocket 是否成功連接到服務器。初始值為 false,在 onOpen() 方法中連接成功后設置為 true。

  • onMessageCallback: ((message: any) => void) | null: 用于存儲一個回調函數,當 WebSocket 接收到消息時會調用此回調函數并傳遞消息內容。初始值為 null,通過 onMessageReceived() 方法注冊。

    private socket: WebSocket | null = null; // 存儲 WebSocket 實例
    private count: number = 0; // 統計接收到的消息數量
    private token: string; // 用于存儲從用戶狀態中獲取的令牌 (token)
    private isConnected: boolean = false; // 用于判斷是否連接成功
    private onMessageCallback: ((message: any) => void) | null = null; // 消息回調函數

1.2 構造函數和連接初始化

  • 構造函數接受一個 socketUrl 參數,用于指定 WebSocket 服務器的地址。

  • 使用 useUserStore() 從用戶狀態中獲取 token,存儲在 this.token 中。

  • 調用 connect(socketUrl) 方法與服務器建立 WebSocket 連接。

    constructor(socketUrl: string) {
    const userStore = useUserStore();
    this.token = userStore.token;
    this.connect(socketUrl);
    }

1.3 WebSocket 連接

connect(socketUrl) 方法創建一個新的 WebSocket 實例,傳入 socketUrl 和 this.token 作為子協議,用于與服務器通信。
為 WebSocket 注冊了以下事件監聽器:

  • open: 當連接成功時觸發,調用 onOpen() 方法。

  • message: 當接收到服務器消息時觸發,調用 onMessage() 方法。

  • error: 當發生錯誤時觸發,調用 onError() 方法。

  • close: 當連接關閉時觸發,調用 onClose() 方法。

    private connect(socketUrl: string) {
    this.socket = new WebSocket(socketUrl, this.token);

    this.socket.addEventListener('open', (event) => {this.onOpen(event);
    });this.socket.addEventListener('message', (event) => {this.onMessage(event);
    });this.socket.addEventListener('error', (event) => {this.onError(event);
    });this.socket.addEventListener('close', (event) => {this.onClose(event);
    });
    

    }

1.4 事件處理方法

onOpen(event: Event): 在 WebSocket 連接成功后觸發。

  • 發送認證信息(Authorization: Bearer token)給服務器,用于身份驗證。

  • 將 isConnected 設置為 true,表示連接成功。

  • 打印 “WebSocket connection established” 到控制臺。

    private onOpen(event: Event) {
    if (this.socket) {
    this.socket.send('Authorization: Bearer ’ + this.token);
    this.isConnected = true;
    console.log(“WebSocket connection established”);
    }
    }

onMessage(event: MessageEvent): 當 WebSocket 接收到消息時觸發。

  • 增加消息計數器 count。

  • 如果注冊了 onMessageCallback,則調用回調函數并傳遞消息數據。

    private onMessage(event: MessageEvent) {
    this.count++;
    console.log(‘Received:’, this.count);

    const messageData = event.data;if (this.onMessageCallback) {this.onMessageCallback(messageData);
    }
    

    }

onError(event: Event): 當 WebSocket 出現錯誤時觸發。

  • 打印錯誤信息到控制臺,幫助調試。

    private onError(event: Event) {
    console.error(“WebSocket error observed:”, event);
    }

onClose(event: CloseEvent): 當 WebSocket 連接關閉時觸發。

  • 將 isConnected 設置為 false,表示連接已斷開。

  • 打印連接關閉信息到控制臺。

    private onClose(event: CloseEvent) {
    console.log(“WebSocket closed:”, event);
    this.isConnected = false;
    }

1.5 發送和關閉 WebSocket 消息

sendMessage(message: string): 用于發送消息到服務器。

  • 如果 WebSocket 連接狀態為 OPEN,則發送消息。

  • 否則打印錯誤信息并顯示 WebSocket 當前的 readyState。

    public sendMessage(message: string) {
    if (this.socket && this.socket.readyState === WebSocket.OPEN) {
    this.socket.send(message);
    } else {
    console.error(“WebSocket is not open. ReadyState:”, this.socket?.readyState);
    }
    }

close(): 手動關閉 WebSocket 連接。

public close() {if (this.socket) {this.socket.close();}
}

1.6 狀態查詢與回調注冊

isConnectedSuccessfully(): 用于查詢 WebSocket 當前的連接狀態,返回 true 或 false。

public isConnectedSuccessfully(): boolean {return this.isConnected;
}

onMessageReceived(callback: (message: any) => void): 注冊一個消息處理回調函數,當 WebSocket 接收到消息時觸發該回調函數。

public onMessageReceived(callback: (message: any) => void) {this.onMessageCallback = callback;
}

1.7 完整代碼

import { useUserStore } from "../module/user";class WebSocketService {private socket: WebSocket | null = null; // 存儲 WebSocket 實例private count: number = 0; // 統計接收到的消息數量private token: string; // 用于存儲從用戶狀態中獲取的令牌 (token)private isConnected: boolean = false; // 用于判斷是否連接成功private onMessageCallback: ((message: any) => void) | null = null; // 消息回調函數constructor(socketUrl: string) {const userStore = useUserStore();this.token = userStore.token;this.connect(socketUrl);}private connect(socketUrl: string) {this.socket = new WebSocket(socketUrl, this.token);this.socket.addEventListener('open', (event) => {this.onOpen(event);});this.socket.addEventListener('message', (event) => {this.onMessage(event);});this.socket.addEventListener('error', (event) => {this.onError(event);});this.socket.addEventListener('close', (event) => {this.onClose(event);});}private onOpen(event: Event) {if (this.socket) {this.socket.send('Authorization: Bearer ' + this.token);this.isConnected = true; // 連接成功console.log("WebSocket connection established");}}private onMessage(event: MessageEvent) {this.count++;console.log('Received:', this.count);const messageData = event.data; // 獲取消息內容if (this.onMessageCallback) {this.onMessageCallback(messageData); // 調用回調函數,傳遞消息內容}}private onError(event: Event) {console.error("WebSocket error observed:", event);}private onClose(event: CloseEvent) {console.log("WebSocket closed:", event);this.isConnected = false; // 連接關閉}public sendMessage(message: string) {if (this.socket && this.socket.readyState === WebSocket.OPEN) {this.socket.send(message);} else {console.error("WebSocket is not open. ReadyState:", this.socket?.readyState);}}public close() {if (this.socket) {this.socket.close();}}public isConnectedSuccessfully(): boolean {return this.isConnected;}public onMessageReceived(callback: (message: any) => void) {this.onMessageCallback = callback;}
}export default WebSocketService;

2. 在 Vue 組件中使用 WebSocketService

在 Vue 組件中,我們可以利用 onMountedonBeforeUnmount 生命周期鉤子來管理 WebSocket 的生命周期。以下是如何在 Vue 組件中使用 WebSocketService 的示例代碼:

import { onMounted, onBeforeUnmount } from 'vue';
import WebSocketService from '../../store/module/websocket';const socketUrl = 'http://123.123.123.123:端口號/ws';
const websocketService = new WebSocketService(socketUrl);onMounted(() => {// 接收消息websocketService.onMessageReceived((message) => {console.log("New message received:", message);// 在這里處理接收到的消息});
});// 關閉 WebSocket 連接
onBeforeUnmount(() => {websocketService.close();console.log("WebSocket connection closed.");
});

2.1 定義 WebSocket URL

const socketUrl = http://123.123.123.123:8088/ws’; 這一行定義了一個字符串 socketUrl,它表示要連接的 WebSocket 服務器的 URL。這個 URL 指向一個運行在 IP 地址為 123.123.123.123 的服務器上,端口為 8088,并且使用 /ws 路徑。

2.2 實例化 WebSocketService

const websocketService = new WebSocketService(socketUrl); 這一行創建了 WebSocketService 類的一個實例,并將之前定義的 socketUrl 作為參數傳遞給構造函數。

2.3 生命周期鉤子

  • onMounted: 當組件掛載時,注冊接收消息的回調函數。這允許我們在接收到新消息時進行相應處理。
  • onBeforeUnmount: 當組件卸載時,調用 close 方法關閉 WebSocket 連接,以釋放資源。

3. 總結

通過上述代碼,我們實現了一個簡單的 WebSocket 服務,能夠在 Vue 應用中進行實時通信。WebSocket 的全雙工通信特性使得我們能夠高效地處理實時數據,而封裝好的 WebSocketService 類則使得代碼更加模塊化和易于維護。

無論是聊天應用、實時通知還是在線游戲,WebSocket 都是實現實時交互的重要工具。希望本文能幫助你更好地理解和使用 WebSocket。在實際開發中,可以根據具體需求擴展和優化這個基礎實現。

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

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

相關文章

【開源】A065—基于SpringBoot的庫存管理系統的設計與實現

🙊作者簡介:在校研究生,擁有計算機專業的研究生開發團隊,分享技術代碼幫助學生學習,獨立完成自己的網站項目。 代碼可以查看項目鏈接獲取??,記得注明來意哦~🌹 贈送計算機畢業設計600個選題ex…

基于python實現自動化的驗證碼識別:探索與實踐

基于python實現自動化的驗證碼識別:探索與實踐 一、驗證碼的類型及特點(一)圖像驗證碼(二)短信驗證碼(三)語音驗證碼 二、驗證碼識別的方法*(一)傳統圖像處理方法&#x…

Vue vs. React:兩大前端框架的深度對比與分析(一)

前言 在當今快速發展的前端領域中,Vue和React作為兩個備受矚目的前端框架,已經成為許多開發者的首選。這兩個框架憑借其出色的設計和強大的功能,在構建現代化、高效性能的Web應用方面扮演著重要角色。 Vue和React都以其獨特的特點吸引了眾多開…

windows安裝使用conda

在Windows系統上安裝和使用Conda的詳細步驟如下: 一、下載Conda安裝包 訪問Conda的官方網站Anaconda | The Operating System for AI,點擊“Downloads”按鈕。在下載頁面,選擇適合您系統的安裝包。通常,對于Windows系統&#xf…

websocket 服務 pinia 全局配置

websocket 方法類 // stores/webSocketStore.ts import { defineStore } from "pinia";interface WebSocketStoreState {ws: WebSocket | null; // WebSocket 實例callbacks: ((message: string) > void)[]; // 消息回調函數列表connected: boolean; // 連接狀態…

Ariba Procurement: Administration_Cloud Basics

# SAP Ariba Procurement: Administration_Cloud Basics 認識Ariba Cloud SAP Ariba Procurement 是一個云計算平臺… The Ariba Cloud 平臺需要簡單理解的概念: Datacenter數據中心:SAP Ariba在世界各地有許多數據中心。這些數據中心構成了Ariba云的基本物理基礎設施。 …

vulnhub靶場【shenron】--1

前言 靶機:shenron-1 攻擊:kali 都采用虛擬機,網卡為橋接模式 主機發現 使用arp-scan -l或netdiscover -r 192.168.1.1/24掃描 信息收集 使用nmap掃描端口 網站信息探測 查看頁面,發現是apache2的默認界面,查看…

等保2.0數據庫測評之SQL server數據庫測評

一、SQL server數據庫介紹 SQL server美國Microsoft公司推出的一種關系型數據庫系統。SQL Server是一個可擴展的、高性能的、為分布式客戶機/服務器計算所設計的數據庫管理系統。 本次安裝環境為Windows10專業版操作系統,數據庫版本為Microsoft SQL Server 2019 (…

無人機之報警器的工作原理!

一、電量監測技術 電量監測是無人機電量指示和報警功能的基礎。通過實時監測無人機的電池電量,系統能夠準確判斷電池的剩余使用時間,并在電量不足時發出報警。電量監測技術通常包括以下幾個方面: 電壓檢測:無人機電池內部通常配…

【pyspark學習從入門到精通23】機器學習庫_6

目錄 分割連續變量 標準化連續變量 分類 分割連續變量 我們經常處理高度非線性的連續特征,而且只用一個系數很難擬合到我們的模型中。 在這種情況下,可能很難只通過一個系數來解釋這樣一個特征與目標之間的關系。有時,將值劃分到離散的桶中…

解密時序數據庫的未來:TDengine Open Day技術沙龍精彩回顧

在數字化時代,開源已成為推動技術創新和知識共享的核心力量,尤其在數據領域,開源技術的涌現不僅促進了行業的快速發展,也讓更多的開發者和技術愛好者得以參與其中。隨著物聯網、工業互聯網等技術的廣泛應用,時序數據庫…

QT 使用共享內存 實現進程間通訊

QSharedMemory:如果兩個進程運行在同一臺機器上,且對性能要求非常高(如實時數據共享、圖像渲染等),建議使用共享內存。 優點: 高性能: 共享內存是進程間通信的最快方式之一,因為數…

在Scala中對隱式轉換格式與作用

隱式對象 格式:implicit object 作用:給函數的默認參數提供隱式值 object Scala12______10 { // case class DataBase(driver: String, url: String) // // implicit object mySql extends DataBase("mysql", "localhost:300") //…

go build command

文章目錄 1.簡介2.格式3.選項4.示例5.小結參考文獻 1.簡介 go build 是 Go 語言工具鏈中的一個命令,它用于編譯 Go 源代碼并生成可執行文件。 2.格式 go build [-o output] [build flags] [packages]可選的 -o 選項強制 build 將生成的可執行文件或對象寫入指定的…

OpenCV實驗:圖片加水印

第二篇:圖片添加水印(加 logo) 1. 實驗原理 水印原理: 圖片添加水印是圖像疊加的一種應用,分為透明水印和不透明水印。水印的實現通常依賴于像素值操作,將水印圖片融合到目標圖片中,常用的方法…

WinDbg 中使用 !process 命令

PROCESS 81a979d0 SessionId: 0 Cid: 0210 Peb: 7ffda000 ParentCid: 063cDirBase: 145b9000 ObjectTable: e12fed70 HandleCount: 53.Image: Dbgview.exe 1. PROCESS 81a979d0 意義:PROCESS 是該進程對象的內核地址。用途:可以使用這個地址獲…

深入解析下oracle的number底層存儲格式

oracle數據庫中,number數據類型用來存儲數值數據,它既可以存儲負數數值,也可以存儲正數數值。相對于其他類型數據,number格式的數據底層存儲格式要復雜得多。今天我們就詳細探究下oracle的number底層存儲格式。 一、環境搭建 1.…

SparkSQL與Hive的整合

文章目錄 SparkSQL與Hive的整合1.1. Spark On Hive1.1.1. Hive的準備工作1.1.2. Spark的準備工作1.1.3. Spark代碼開發1.1.4. Spark On Hive案例 1.2. Hive On Spark1.3. SparkSQL命令行1.4. SparkSQL分布式查詢引擎1.4.1. 開啟ThriftServer服務1.4.2. beeline連接ThriftServer…

(持續更新)linux網絡編程中需要注意的內核參數與網絡機制

目錄 零、基本說明 一、內核參數 二、相關機制 1、GRO (1)適用場景 (2)優缺點 (3)相關操作 2、Nagle 算法 (1)基本規則 (2)優缺點 (3&…

DevExpress WPF中文教程:Grid - 如何移動和調整列大小?(一)

DevExpress WPF擁有120個控件和庫,將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序,這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…