当前位置: 首页 > news >正文

在 Vue 中使用 ReconnectingWebSocket实现即时通讯聊天客服功能

在 Vue 中使用 ReconnectingWebSocket

ReconnectingWebSocket 是一个自动重连的 WebSocket 实现,非常适合在 Vue 项目中使用。下面是如何在 Vue 中集成和使用它的方法:

搜索  "程序员老狼"

安装 ReconnectingWebSocket

首先,你需要安装 ReconnectingWebSocket 库:

npm install reconnecting-websocket
# 或者
yarn add reconnecting-websocket

基本使用方法

1. 在组件中直接使用

import ReconnectingWebSocket from 'reconnecting-websocket';export default {data() {return {socket: null,messages: []};},mounted() {// 创建 WebSocket 连接this.socket = new ReconnectingWebSocket('ws://your-websocket-url');// 监听消息this.socket.addEventListener('message', (event) => {this.messages.push(event.data);});// 监听连接打开this.socket.addEventListener('open', () => {console.log('WebSocket connected');});// 监听错误this.socket.addEventListener('error', (error) => {console.error('WebSocket error:', error);});// 监听连接关闭this.socket.addEventListener('close', () => {console.log('WebSocket disconnected');});},methods: {sendMessage(message) {if (this.socket && this.socket.readyState === WebSocket.OPEN) {this.socket.send(message);}}},beforeDestroy() {// 组件销毁时关闭连接if (this.socket) {this.socket.close();}}
};

2. 作为 Vue 插件使用(推荐)

为了更好的复用性,可以创建一个 Vue 插件:

​src/plugins/websocket.js​

import ReconnectingWebSocket from 'reconnecting-websocket';const WebSocketPlugin = {install(Vue, options) {const socket = new ReconnectingWebSocket(options.url, [], {connectionTimeout: options.timeout || 5000,maxRetries: options.maxRetries || 10});Vue.prototype.$socket = socket;// 添加全局方法Vue.prototype.$connectWebSocket = function() {socket.reconnect();};Vue.prototype.$disconnectWebSocket = function() {socket.close();};}
};export default WebSocketPlugin;

​在 main.js 中注册插件​

import Vue from 'vue';
import WebSocketPlugin from './plugins/websocket';Vue.use(WebSocketPlugin, {url: 'ws://your-websocket-url',timeout: 5000,maxRetries: 10
});

​在组件中使用​

export default {mounted() {this.$socket.addEventListener('message', (event) => {console.log('Received message:', event.data);});// 发送消息this.$socket.send('Hello, server!');},beforeDestroy() {// 可选:关闭连接this.$disconnectWebSocket();}
};

高级配置选项

ReconnectingWebSocket 提供了多种配置选项:

const socket = new ReconnectingWebSocket('ws://your-websocket-url', [], {// 自动重连的最小延迟时间(毫秒)minReconnectionDelay: 1000,// 自动重连的最大延迟时间(毫秒)maxReconnectionDelay: 5000,// 重连延迟时间的增长因子reconnectionDelayGrowFactor: 1.3,// 连接超时时间(毫秒)connectionTimeout: 4000,// 最大重试次数,Infinity 表示无限重试maxRetries: Infinity,// 是否在关闭时自动重连automaticOpen: true,// 是否在连接丢失时立即尝试重连startClosed: false,// 调试模式debug: false
});

注意事项

  1. ​跨域问题​​:确保你的 WebSocket 服务器支持跨域请求
  2. ​SSL​​:生产环境建议使用 wss:// 而不是 ws://
  3. ​组件销毁​​:记得在组件销毁时关闭连接,避免内存泄漏
  4. ​响应式数据​​:WebSocket 消息不是响应式的,需要手动更新 Vue 的数据
  5. ​重连策略​​:根据业务需求调整重连策略参数

完整示例

<template><div><h1>WebSocket Demo</h1><button @click="sendMessage">Send Message</button><div v-for="(msg, index) in messages" :key="index">{{ msg }}</div></div>
</template><script>
import ReconnectingWebSocket from 'reconnecting-websocket';export default {data() {return {socket: null,messages: [],connectionStatus: 'disconnected'};},mounted() {this.initWebSocket();},methods: {initWebSocket() {this.socket = new ReconnectingWebSocket('ws://your-websocket-url', [], {minReconnectionDelay: 1000,maxRetries: 10});this.socket.addEventListener('open', () => {this.connectionStatus = 'connected';console.log('WebSocket connected');});this.socket.addEventListener('message', (event) => {this.messages.push(event.data);});this.socket.addEventListener('error', (error) => {this.connectionStatus = 'error';console.error('WebSocket error:', error);});this.socket.addEventListener('close', () => {this.connectionStatus = 'disconnected';console.log('WebSocket disconnected');});},sendMessage() {if (this.socket && this.socket.readyState === WebSocket.OPEN) {this.socket.send('Hello from Vue!');}}},beforeDestroy() {if (this.socket) {this.socket.close();}}
};
</script>

通过这种方式,你可以在 Vue 应用中轻松实现具有自动重连功能的 WebSocket 通信。

http://www.lryc.cn/news/614653.html

相关文章:

  • Java 使用 SSHJ 执行 SSH 命令和 SFTP 文件上传和下载
  • 【前端后端部署】将前后端项目部署到云服务器
  • Redis(④-消息队列削峰)
  • 吴恩达 深度学习笔记
  • Coze Studio 概览(九)--插件管理
  • 配电线路故障定位在线监测装置的技术解析与应用价值
  • 应急响应流程
  • 基于 C++ 的湍流数值模拟理论报告
  • 从零构建桌面写作软件的书籍管理系统:Electron + Vue 3 实战指南
  • 中小业务遭遇网络攻击,防护能力不足的解决办法​
  • electron 静默安装同时安装完成后自动启动(nsis)
  • Spark在什么情况下CBO才会判断失误,如何避免
  • 服务器登上去,显示 failed to send WATCHDOG 重启有效吗?
  • Uber的MySQL实践(一)——学习笔记
  • I/O原理与服务。
  • 智慧交通场景下 mAP↑28%:陌讯多模态融合算法实战解析
  • OpenAI 开源模型 GPT-OSS MCP服务器深度解密:从工具集成到系统提示全自动化,浏览器+Python无缝协同的底层逻辑
  • 微软Azure AI Foundry正式上线GPT-5系列模型
  • CORS 跨域问题 Next.js 跨域问题放通
  • 《从零构建大语言模型》学习笔记2,文本数据处理1(以及tiktoken库无法下载gpt2参数,调用get_encoding时SSL超时的解决方法)
  • 中国的超算中心使用情况如何?是否算力过剩
  • Eyevinn 彻底改变开源部署模式
  • 初步认识AMSU-A/B、HIRS-3/4、MHS、ATMS、GOES
  • 字典列表依据数值键排序
  • 【跨国数仓迁移最佳实践5】MaxCompute近线查询解决方案助力物流电商等实时场景实现高效查询
  • 防火墙安全作用及 firewalld 交互、端口配置
  • zookeeper3.8.4安装以及客户端C++api编译
  • hyper-v虚拟机启动失败:Virtual Pci Express Port无法打开电源,因为发生错误,找不到即插即用设备
  • ESP32-menuconfig(2) -- Application manager
  • Lazada东南亚矩阵营销破局:指纹手机如何以“批量智控+数据中枢”重构运营生态