Vue3 + WebSocket

Vue3与WebSocket结合能够很好地满足实时通讯的需求。通过合理设计和管理WebSocket连接的生命周期,以及实现必要的重连逻辑和心跳检测机制,可以构建出响应迅速且稳定的实时应用。

WebSocket

WebSocket允许服务端主动向客户端发送数据,无需客户端发起请求,从而实现了低延迟、高效率的数据交换。它通过HTTP升级协议握手来建立持久性的连接,并使用帧(frame)的形式传输数据。

Vue3中实现WebSocket通讯

创建WebSocket实例

首先,在Vue3组件中创建一个WebSocket实例,并监听其生命周期事件:

<template><!-- 省略其他UI元素 --><button @click="sendMessage">发送消息</button><ul><li v-for="(message, index) in messages" :key="index">{{ message }}</li></ul>
</template><script setup>
import { ref } from 'vue';// 创建WebSocket实例,替换为你的实际服务器地址
const ws = new WebSocket('ws://your-websocket-server-url/webSocket');// 初始化消息数组
const messages = ref([]);// 监听WebSocket打开事件
ws.addEventListener('open', () => {console.log('WebSocket已连接');
});// 监听接收到消息的事件
ws.addEventListener('message', (event) => {const data = JSON.parse(event.data);messages.value.push(data.message);
});// 发送消息至服务器的方法
function sendMessage() {const message = 'Hello, Server!';ws.send(JSON.stringify({ message }));
}// 监听WebSocket关闭事件
ws.addEventListener('close', () => {console.log('WebSocket连接已关闭');
});// 监听错误事件
ws.addEventListener('error', (error) => {console.error('WebSocket发生错误:', error);
});
</script>

上述代码展示了如何在Vue3组件内初始化WebSocket连接,并添加了基本的消息发送和接收功能。

管理WebSocket连接的生命周期

在真实项目中,你需要考虑在组件挂载时建立连接,在卸载时关闭连接,以确保资源的有效管理和回收:

<script setup>
import { onMounted, onUnmounted } from 'vue';let ws;onMounted(() => {ws = new WebSocket('ws://your-websocket-server-url/webSocket');// ... 添加其他生命周期事件监听器
});onUnmounted(() => {if (ws.readyState !== WebSocket.CLOSED) {ws.close();}
});
</script>

    webSocket.readyState

    readyState属性返回实例对象的当前状态,共有四种。

    • CONNECTING:值为0,表示正在连接。
    • OPEN:值为1,表示连接成功,可以通信了。
    • CLOSING:值为2,表示连接正在关闭。
    • CLOSED:值为3,表示连接已经关闭,或者打开连接失败。
    处理重连逻辑和心跳检测

    为了保证WebSocket连接的稳定性和可靠性,通常还需要实现重连逻辑以及心跳检测机制。当连接断开时,可以尝试重新连接;同时,定期发送心跳包维持长连接,防止因网络波动导致的意外断开。

    <script setup>
    import { ref, watchEffect } from 'vue';// ... 其他变量定义和初始化// 用于控制重连的计数器
    const reconnectAttempts = ref(0);// 在断开连接后尝试重新连接
    function handleReconnect() {setTimeout(() => {reconnectAttempts.value++;if (reconnectAttempts.value <= MAX_RECONNECT_ATTEMPTS) {connectWebSocket();} else {console.log('超过最大重试次数,停止重连');}}, RECONNECT_DELAY);
    }// 心跳检测函数
    function sendHeartbeat() {// 定期发送心跳包给服务器ws.send(JSON.stringify({ type: 'heartbeat' }));
    }// 在连接成功后启动心跳检测
    function startHeartbeat() {setInterval(sendHeartbeat, HEARTBEAT_INTERVAL);
    }// 连接WebSocket的方法
    function connectWebSocket() {ws = new WebSocket('ws://your-websocket-server-url/webSocket');// 添加事件监听器...// ...ws.addEventListener('close', handleReconnect);ws.addEventListener('open', startHeartbeat);
    }onMounted(connectWebSocket);
    // ... 其他生命周期处理
    </script>

      实例对象的onmessage属性,用于指定收到服务器数据后的回调函数。

      
      ws.onmessage = function(event) {var data = event.data;// 处理数据
      };ws.addEventListener("message", function(event) {var data = event.data;// 处理数据
      });
      

      注意,服务器数据可能是文本,也可能是二进制数据(blob对象或Arraybuffer对象)。

      
      ws.onmessage = function(event){if(typeof event.data === String) {console.log("Received data string");}if(event.data instanceof ArrayBuffer){var buffer = event.data;console.log("Received arraybuffer");}
      }
      

      除了动态判断收到的数据类型,也可以使用binaryType属性,显式指定收到的二进制数据类型。

      
      // 收到的是 blob 数据
      ws.binaryType = "blob";
      ws.onmessage = function(e) {console.log(e.data.size);
      };// 收到的是 ArrayBuffer 数据
      ws.binaryType = "arraybuffer";
      ws.onmessage = function(e) {console.log(e.data.byteLength);
      };

      webSocket.send()

      实例对象的send()方法用于向服务器发送数据。

      发送文本的例子。

      
      ws.send('your message');
      

      发送 Blob 对象的例子。

      
      var file = document.querySelector('input[type="file"]').files[0];
      ws.send(file);
      

      发送 ArrayBuffer 对象的例子。

      
      // Sending canvas ImageData as ArrayBuffer
      var img = canvas_context.getImageData(0, 0, 400, 320);
      var binary = new Uint8Array(img.data.length);
      for (var i = 0; i < img.data.length; i++) {binary[i] = img.data[i];
      }
      ws.send(binary.buffer);
      

      webSocket.bufferedAmount

      实例对象的bufferedAmount属性,表示还有多少字节的二进制数据没有发送出去。它可以用来判断发送是否结束。

      
      var data = new ArrayBuffer(10000000);
      socket.send(data);if (socket.bufferedAmount === 0) {// 发送完毕
      } else {// 发送还没结束
      }

      总结

      综上所述,Vue3与WebSocket结合能够很好地满足实时通讯的需求。通过合理设计和管理WebSocket连接的生命周期,以及实现必要的重连逻辑和心跳检测机制,可以构建出响应迅速且稳定的实时应用。在实际开发中,还可以根据具体业务需求对WebSocket通讯做更深入的定制和优化。

      本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
      如若转载,请注明出处:http://www.pswp.cn/news/915107.shtml
      繁体地址,请注明出处:http://hk.pswp.cn/news/915107.shtml

      如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

      相关文章

      IPSec和HTTPS对比(一)

      IPSec&#xff08;Internet Protocol Security&#xff09;是网络层&#xff08;OSI第3层&#xff09;的加密协议&#xff0c;其核心机制和与HTTPS的区别如下&#xff1a;&#x1f512; ​一、IPSec的核心机制解析​​1. 安全封装结构​┌──────────┬───────…

      关于 c、c#、c++ 三者区别

      1. 起源与定位语言起源时间开发者定位/特点C1972年Dennis Ritchie面向过程的编程语言&#xff0c;强调底层控制与高效性能C1983年Bjarne Stroustrup在 C 的基础上加入 面向对象编程&#xff08;OOP&#xff09;C#2000年微软&#xff08;Microsoft&#xff09;类似 Java&#xf…

      项目总体框架(servlet+axios+Mybatis)

      项目总体框架 先暂时这样子&#xff08;后续发现错误的话就改&#xff09; com.hope-tieba/ ← 项目根 ├─ .idea/ ← IDEA 工程配置 ├─ src/ │ ├─ main/ │ │ ├─ java/ │ │ │ └─ com/hope/ │ │ …

      RestTemplate 实现后端 HTTP 调用详解

      1. 方法签名解析方法名和返回类型说明了这个方法的业务意图和数据结构。Override 表示实现接口方法&#xff0c;利于规范开发和自动检查。Override public List<RobotInfo> listRobots() {这里 RobotInfo 是假设的业务数据结构&#xff0c;实际项目中按你的类名即可。2. …

      Python单例模式详解:从原理到实战的完整指南

      引言 单例模式是软件设计中最常用的模式之一&#xff0c;它确保一个类只有一个实例&#xff0c;并提供全局访问点。在Python中&#xff0c;实现单例模式有多种优雅的方式&#xff0c;本文将详细讲解6种主流实现方法&#xff0c;包含完整代码示例和注释。 一、模块级单例&#x…

      拼团系统中的幂等性防护 , 前置性查询,Redis 库存预判

      这段内容涉及两个关键点&#xff1a;幂等性防护 和 拼团目标量判断&#xff0c;下面我将分别解释这两个问题&#xff0c;并重点说明&#xff1a; “如果没有拦截&#xff0c;最终访问数据&#xff0c;也会有数量判断拦截。” 这句话的意思。 ✅ 1. 查询外部交易 outTradeNo 是…

      【Python】LEGB作用域 + re模块 + 正则表达式

      文章目录一 LEGB作用域二 re&#xff08;Regular Expression&#xff09;预览1. re.match() —— 从字符串开头匹配2. re.search() —— 搜索整个字符串3. re.findall() —— 返回所有匹配的字符串列表4. re.finditer() —— 返回所有匹配的迭代器5. re.sub() —— 替换匹配的字…

      JavaSE -- 数据操作流

      6. 数据操作流在执行文件存储一个对象的时候&#xff0c;如果该对象只有少量属性需要存储&#xff0c;并且这些属性的类型都是基本数据类型&#xff0c;此时则不需要对象序列化技术。使用数据操作流既可以实现。 DataOutputStreamDataInputStream 注意&#xff1a; 读取数据的时…

      GI6E 加密GRID電碼通信SHELLCODE載入

      GI6E https://github.com/MartinxMax/gi6e 「它似乎能從特製的音訊信號中提取敏感資訊。」 HEX-GRID CODEX&#xff08;簡稱 HGC&#xff09;是一種自定義的 6 位元結構編碼系統&#xff0c;使用三位元的群組識別碼&#xff08;Group Bits&#xff09;加上三位元的索引識別碼…

      实习十三——传输层协议

      补充子网划分的主要目的就是为了节约IP&#xff0c;降低成本&#xff0c;但是如果划分私有IP网段&#xff0c;则完全没有意义&#xff0c;因为私有IP可重复&#xff0c;不要钱&#xff0c;所以私有IP严禁进行子网掩码划分传输层协议TCP三次握手TCP协议数据格式第一次握手&#…

      RPG59.玩家拾取物品三:可拾取物品的提示UI

      1。以WarriorWidgetBase作为父类&#xff0c;创建一个子类的userwidget2.布局为两个值都为1203。然后我们需要想办法&#xff0c;在合适的位置&#xff0c;用bool来控制此控件的显示与隐藏。情况为&#xff1a;当玩家触发与可拾取物体的重叠时&#xff0c;我们将广播一个bool值…

      Vue.js 国际化 (i18n) 实践:让你的应用走向全球,多语言支持如此简单!

      文章目录一、为何你的 Vue.js 应用需要“说多种语言”&#xff1f;国际化的重要性二、Vue I18n 基础实践&#xff1a;从零开始搭建多语言环境2.1 安装 Vue I18n2.2 配置 Vue I18n 实例2.3 在组件中使用翻译三、进阶实践&#xff1a;让国际化更强大、更灵活3.1 动态语言切换3.2 …

      在CentOS7.9服务器上安装.NET 8.0 SDK

      在 CentOS 7.9 系统上手动安装 .NET 8.0 SDK&#xff08;使用本地的 dotnet-sdk-8.0.101-linux-x64.tar.gz 文件&#xff09;&#xff0c;可以按照以下步骤进行操作。由于 CentOS 7.9 已不再被微软官方支持&#xff0c;可能会遇到依赖库版本问题&#xff08;如 GLIBCXX 和 GLIB…

      HarmonyOS-ArkUI Web控件基础铺垫4--TCP协议- 断联-四次挥手解析

      HarmonyOS-ArkUI&#xff1a; Web组件加载流程1 HarmonyOS-ArkUI Web控件基础铺垫1-HTTP协议-数据包内容 HarmonyOS-ArkUI Web控件基础铺垫2-DNS解析 HarmonyOS-ArkUI Web控件基础铺垫3--TCP协议- 从规则本质到三次握手-CSDN博客 接上文&#xff0c;上文我们讲解了: 数据在…

      如何用AI 生成论文/书籍的摘要

      不知道大家是否有这样的感觉&#xff0c;上网浏览信息&#xff0c;看到好的文章就兴奋地下载了下来&#xff0c;文件的名称通常是一串奇奇怪怪的字符串。过了几天就在电脑中找不着了。没有网络上搜索不到的文章&#xff0c;而是在你的电脑中却找不到它们。几年下来&#xff0c;…

      ubuntu系统+N卡 | docker compose+ollama+dify(dify和ollama在同一容器)

      1、安装NVIDIA驱动 2、安装docker&#xff0c;docker compose 3、安装NVIDIA Container Toolkit Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit&#xff08;仅 GPU 场景需要&#xff09; # Configure the production repository: curl -fsSL https://…

      实习手记:基于大模型的搜索引擎开发实践

      初入团队&#xff1a;从理论到实践的跨越五月份开始&#xff0c;我怀着忐忑又期待的心情以线上的方式加入了公司AI研发中心的搜索引擎优化小组。作为一名数据科学与大数据技术专业的学生&#xff0c;这是我第一次参与工业级AI项目的开发&#xff0c;团队的任务是构建一个基于大…

      用Python实现神经网络(二)

      #Overfitting是机器学习的主要问题。下面我们来看一下过拟合现像&#xff1a;import numpy as npimport matplotlib.pyplot as pltimport matplotlib as mplimport tensorflow as tffrom scipy.optimize import curve_fit# Generic matplotlib parameters for plots and figure…

      数据结构入门 (二):挣脱连续空间的束缚 —— 单向链表详解

      TOC(目录) 引言&#xff1a;整齐的代价 在上一篇文章中&#xff0c;我们一起探索了数据结构大家族的第一位成员——顺序表。我们了解到&#xff0c;顺序表作为一种线性结构&#xff0c;其最大的特点在于逻辑顺序与物理顺序的一致性&#xff0c;即元素之间不仅存在逻辑上的前后关…

      AI-视频一致性与多帧控制在AIGC中的技术挑战与突破!

      全文目录&#xff1a;开篇语前言1. 视频中人物一致性建模的难点与现有解决方案**人物一致性建模的挑战****现有解决方案****案例代码&#xff1a;基于姿态估计的多帧一致性保持**2. 光照/纹理/姿态跨帧保持方法剖析**跨帧光照与纹理一致性****跨帧姿态一致性**3. 帧间插值与关键…