vue3 websocket连接 发送数据

先建一个websocket.js放在项目中,内容如下:

var websock = null;
let rec; //断线重连后,延迟5秒重新创建WebSocket连接  rec用来存储延迟请求的代码
let isConnect = false; //连接标识 避免重复连接
let checkMsg = "heartbeat"; //心跳发送/返回的信息 服务器和客户端收到的信息内容如果如下 就识别为心跳信息 不要做业务处理
let globalSendCallback=()=>{};
let globalGetCallback=()=>{};let createWebSocket = () => {try {initWebSocket(); //初始化websocket连接} catch (e) {console.log("尝试创建连接失败");reConnect(); //如果无法连接上webSocket 那么重新连接!可能会因为服务器重新部署,或者短暂断网等导致无法创建连接}
};//定义重连函数
let reConnect = () => {console.log("尝试重新连接");if (isConnect) return; //如果已经连上就不在重连了rec && clearTimeout(rec);rec = setTimeout(function () { // 延迟5秒重连  避免过多次过频繁请求重连createWebSocket();}, 5000);
};
//设置关闭连接
let closeWebSocket = () => {websock.close();
};
//心跳设置
var heartCheck = {timeout: 20000, //每段时间发送一次心跳包 这里设置为20stimeoutObj: null, //延时发送消息对象(启动心跳新建这个对象,收到消息后重置对象)start: function () {this.timeoutObj = setTimeout(function () {if (isConnect) websock.send(checkMsg);}, this.timeout);},reset: function () {clearTimeout(this.timeoutObj);this.start();}
};// 初始化websocket
function initWebSocket() {// ws地址 -->这里是你的请求路径var ws = "ws://10.30.2.31:8087/websocket/";websock = new WebSocket(ws)websock.onmessage = function (e) {websocketonmessage(e)}websock.onclose = function (e) {websocketclose(e)}websock.onopen = function () {websocketOpen()heartCheck.start();console.log("连接状态:", websock.readyState);}// 连接发生错误的回调方法websock.onerror = function () {console.log('WebSocket连接发生错误')isConnect = false; //连接断开修改标识reConnect(); //连接错误 需要重连}
}// 实际调用的方法
function sendSock(agentData, callback) {console.log(globalSendCallback)globalSendCallback = callbackif (websock.readyState === websock.OPEN) {// 若是ws开启状态websocketsend(agentData)} else if (websock.readyState === websock.CONNECTING) {// 若是 正在开启状态,则等待1s后重新调用setTimeout(function () {sendSock(agentData, callback)}, 1000)} else {// 若未开启 ,则等待1s后重新调用setTimeout(function () {sendSock(agentData, callback)}, 1000)}
}function getSock(callback) {console.log(globalGetCallback)globalGetCallback = callback
}
// 数据接收
function websocketonmessage(e) {console.log(e)let O_o = JSON.parse(decodeUnicode(e.data))// console.log(O_o)if (!O_o) {// if (O_o != '连接成功') {heartCheck.reset();} else {// if (O_o.msg == "open success") {//     sessionStorage.setItem("wid", O_o.wid);// } else {//      console.log(globalGetCallback)globalGetCallback(O_o);//注释记得解开// }}// globalCallback(JSON.parse(e.data))function decodeUnicode(str) {str = str.replace(/\\/g, "%");//转换中文str = unescape(str);//将其他受影响的转换回原来str = str.replace(/%/g, "\\");//对网址的链接进行处理str = str.replace(/\\/g, "");return str;}
}// 数据发送
function websocketsend(agentData) {console.log(JSON.stringify(agentData))websock.send(JSON.stringify(agentData))
}// 关闭
function websocketclose(e) {console.log(e)isConnect = false; //断开后修改标识   console.log('连接关闭 (' + e.code + ')')// 显示确认对话框//  const confirmation = window.confirm('WebSocket连接已关闭,是否重新连接?');//  if (confirmation) {//      // 用户点击了确认按钮,执行重新连接操作//      createWebSocket();//  }// openAlert({ content: value, title:'提示', status: 'error' })// 从本地存储中获取日志数据,如果没有则默认为空数组// const logs = localStorage.getItem('logs');// const currentTime = new Date().toLocaleString();// const newLog = `${currentTime} `+'连接关闭 (' + e.code + ')';// logs.value.unshift(newLog); // 将新的日志消息添加到数组最前面// localStorage.setItem('logs', JSON.stringify(logs.value)); // 保存到本地
}// 创建 websocket 连接
function websocketOpen(e) {console.log('连接成功')}initWebSocket()// 将方法暴露出去
export {sendSock,getSock,createWebSocket,closeWebSocket
}

2,在组件中引用

// WebSocket封装方法
import * as socketApi from '@/directives/webSocket'socketApi.sendSock({ cmd: "startReport" }); //发送指令,指令是跟后端人员协定的
let getConfigResult = (data)=>{// let res = '{"type": "MatData","log": "","id": "1234452312312","value": "22222222"}'console.log(data);let res = JSON.parse(data);}
socketApi.getSock(getConfigResult); //接收后端推送过来的数据

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

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

相关文章

MySQL与Redis如何保证数据的一致性

文章目录 MySQL与Redis如何保证数据的一致性?不好的方案1. 先写 MySQL,再写 Redis2. 先写 Redis,再写 MySQL3. 先删除 Redis,再写 MySQL 好的方案4. 先删除 Redis,再写 MySQL,再删除 Redis5. 先写 MySQL&am…

C# 数据库封装

最近有些地方用到c#,研究了一下,也有数据库方面的操作,那就继续封装,自己用起来好用一点。 数据库连接 using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using Sys…

Leetcode算法系列| 1. 两数之和(四种解法)

目录 1.题目2.题解解法一:暴力枚举解法二:哈希表解法解法三:双指针(有序状态)解法四:二分查找(有序状态) 1.题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数…

『RabbitMQ』入门指南(安装,配置,应用)

前言 RabbitMQ 是在 AMQP(Advanced Message Queuing Protocol) 协议标准基础上完整的,可复用的企业消息系统。它遵循 Mozilla Public License 开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,建立在 Erlang …

产品经理提问常用的ChatGPT通用提示词模板

如何评估产品市场的潜力和可行性? 如何定义和明确产品的目标用户和需求? 如何进行竞品分析和比较,制定产品的差异化策略? 如何设计产品的功能和特性,满足用户需求? 如何制定产品的定价策略和销售计划&a…

qml View3D使用介绍

在Qt Quick 3D中,View3D 是一个用于展示 3D 内容的 QML 类型。View3D 允许你将 3D 场景集成到 Qt Quick 2D 用户界面中,这意味着你可以在传统的 2D UI 元素(如按钮、文本和图像)与 3D 图形之间无缝地进行整合。 View3D 提供了一个视口,用于渲染 3D 场景。它可以包括多个 …

HTTPS攻击怎么防御?

HTTPS 简介 超文本传输安全协议( HTTPS )是一种通过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。 HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的…

批量将本地N个英文Html文档进行中文翻译-操作篇

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…

QtCreator9.02不支持JDK11解决

最终效果 使用Android Studio 下载Android SDK Platform 31与Sources for Android 31 下载Android SDK Build Tools 31.0.0 下载NDK 25.1 ,23.1 ,21.3 重要: 下载Android SDK Command-Line Tools ,选择10.0或者9.0其中一个版本 其它版本不支持JDK11 ,本例选择10.0 下载CMak…

如何进行MySQL的主从复制(MySQL5.7)

背景:在一些Web服务器开发中,系统用户在进行数据访问时,基本都是直接操作数据库MySQL进行访问,而这种情况下,若只有一台MySQL服务器,可能会存在如下问题 数据的读和写的所有压力都会由一台数据库独…

浅析jdk8所包含的主要特性

至今Java 8仍然是许多开发者首选的JDK版本,Java 8的生态系统非常成熟,许多库和框架都已经适配了Java 8。迁移到新的Java版本可能需要重新评估和调整现有的依赖关系,这对于一些大型项目可能是一个挑战。那么Java 8有哪些特性让多数开发者钟爱呢…

西米支付:如何设计和构建游戏支付系统?

如何设计和构建游戏支付系统? 目前,游戏开发中最常见的支付方式包括微信支付、支付宝支付和苹果支付等。今天,我将与大家分享游戏支付系统的架构和设计。 游戏支付的主要业务流程是指游戏玩家在游戏中购买虚拟物品或服务所进行的支付过程。一…

ElasticSearch 7 SQL 详解

平时使用Elasticsearch的时候,会在Kibana中使用Query DSL来查询数据.每次要用到Query DSL时都基本忘光了,需要重新在回顾一遍,最近发现Elasticsearch已经支持SQL查询了(6.3版本以后),整理了下一些用法. 简介 Elasticsearch SQL是一个X-Pack组件,它允许针对Elasticsearch实时执…

ESP32之避障

ESP32之避障 图片 程序 int Led27;//定义LED 接口 int buttonpin4; //定义光遮断传感器接口 int val;//定义数字变量val void setup() { pinMode(Led,OUTPUT);//定义LED 为输出接口 pinMode(buttonpin,INPUT);//定义避障传感器为输出接口 } void loop() {Serial.begin(9600);…

保姆级 Keras 实现 YOLO v3 一

保姆级 Keras 实现 YOLO v3 一 一. YOLO v3 总览二. 特征提取网络特征提取网络代码实现 三. 特征融合特征融合代码实现 四. 网络输出模型输出代码实现 五. 网络模型代码实现六. 代码下载 如果要给 YOLO 目标检测算法一个评价的话, 就是快和准, 现在已经到了 v8, 但是我为什么还…

如何开启MySQL的慢查询日志

说明:如果需要查看某一条SQL查询速度慢,并对慢的SQL进行优化,那么开启MySQL慢查询日志是一定要做的事情,本文介绍如何开启MySQL的慢查询日志; 查看MySQL慢查询是否开启 首先,输入下面的命令,查…

为什么 x86 操作系统从 0x7c00 处开始

0x00:x86 架构 BIOS 引导加载程序中的"0x7C00"之谜 你知道 x86 操作系统中的"0x7C00"这个神奇数字吗 ? "0x7C00" 是BIOS加载MBR(主引导记录,磁盘中的第一个扇区)的内存地址。操作系统或引导加载…

2-Linux学习环境搭建

1 Linux学习环境搭建 1.1 虚拟化介绍 # win 机器----》装一个虚拟化软件----》虚拟化出linux操作系统# kvm vmware openstack docker k8s # kvm vmware 虚拟化软件 -运行在linux上,做虚拟化的软件 -vmware运行在win,linux,商业软件…

AMEYA360:瑞萨面向高端工业传感器系统推出高精度模拟前端的32位RX MCU

全球半导体解决方案供应商瑞萨电子(TSE:6723)宣布面向高端工业传感器系统推出一款全新RX产品——RX23E-B,扩展32位微控制器(MCU)产品线。新产品作为广受欢迎的RX产品家族的一员,具有高精度模拟前…

hadoop2.x linux集群部署

hadoop2.x 集群部署 下载hadoop需要提前准备好jdk1.8 和rsync 和ssl集群信息解压安装配置环境变量配置site配置文件(/hadoop/etc/hadoop目录下)core-site.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xmlhadoop-env.sh要追加java_home!配置节点slaves 配置免密ssh访问没有ssh-co…