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

websocket每隔5秒给服务端send一次信息

websocket轮询每隔5秒给服务端send一次信息,主要功能点如下:

  1. socket 采用了定时器 setInterval() 需要清除定时器否则会报错

  1. 监听了突然关闭浏览器窗口,destroyed里面直接监听 window.removeEventListener("beforeunload", e => this.beforeunloadHandler(e)) 然后调用this.webstock.close()关闭socket的长链接。

  1. WebSocket连接发生错误的时候,连接错误 需要重连this.reConnect(),尝试重新连接,本次重连次数大于6次就不连接了,放弃连接。

先上效果图:

一 、功能点一清除定时器:

clearInterval(this.timer) // 清除定时器

二、功能点二监听了突然关闭浏览器窗口:

  mounted() {window.addEventListener("beforeunload", e => this.beforeunloadHandler(e))window.addEventListener("unload", e => this.unloadHandler(e))},
    beforeunloadHandler() {this._beforeUnload_time = new Date().getTime();},unloadHandler(e) {this._gap_time = new Date().getTime() - this._beforeUnload_time;// debugger// 关闭或刷新窗口都保存数据到后台// 判断窗口是关闭还是刷新if (this._gap_time <= 5) {// 关闭连接this.webstock.close()} }
  destroyed() {this.$destroy()clearInterval(this.timer) // 清除定时器// 页面销毁时关闭长连接// if (this.webstock !== null) {//   this.webstock.close()// } window.removeEventListener("beforeunload", e => this.beforeunloadHandler(e))window.removeEventListener("unload", e => this.unloadHandler(e))}

三、功能点三WebSocket连接发生错误的时候,连接错误 需要重连

websocketonerror(e) {console.log("WebSocket连接发生错误")// 连接断开后修改标识this.isConnect = false// 连接错误 需要重连this.reConnect()}},

全部代码如下:

<template>
</template><script>
export default {data() {return {timer: 5000,webstock: '', // webSocket使用isConnect: false, // webSocket连接标识 避免重复连接reConnectNum: 1, // 断开后重新连接的次数 免得后台挂了,前端一直重连_beforeUnload_time: null,_gap_time: null}},methods: {/*webSocket start*/initWebSocket() {let userId = this.$store.state.user.userIdif (userId !== null && userId !== '') {// WebSocket与普通的请求所用协议有所不同,ws等同于http,wss等同于https// 本地环境// let wsServer =// `${//   location.protocol === "https" ? "wss" : "ws"// }://localhost:9106/接口前缀/websocket/` + userId;// 线上环境let wsServer = 'ws://172.16.0.54:8102/api/webSocket/' + userIdconsole.log("wsServer:", wsServer)this.webstock = new WebSocket(wsServer)this.webstock.onopen = this.websocketonopenthis.webstock.onerror = this.websocketonerrorthis.webstock.onmessage = this.websocketonmessagethis.webstock.onclose = this.websocketclose}},websocketonopen() {console.log("WebSocket连接成功") // 连接建立后修改标识this.isConnect = trueconst timeoutInfoId = '420507657544310784'clearInterval(this.timer) // 清除定时器const that = thissetInterval(() => {if (window.location.pathname === '/standardTemplate') {that.webstock.send(timeoutInfoId)}}, this.timer)},websocketonerror(e) {console.log("WebSocket连接发生错误")// 连接断开后修改标识this.isConnect = false// 连接错误 需要重连// this.reConnect()if (window.location.pathname === '/standardTemplate') {this.reConnect()}},// 接收后端推送过来的消息websocketonmessage(e) {console.log("message消息:", e.data)// if (e != null) {//   let str = JSON.parse(e.data)// }},websocketclose(e) {console.log("webSocket连接关闭")// 连接断开后修改标识this.isConnect = falsethis.webstock = ''if (window.location.pathname === '/standardTemplate') {this.reConnect()}},// 重新连接reConnect() {console.log("尝试重新连接,本次重连次数:" + this.reConnectNum)if (this.reConnectNum > 6) {return false}// 如果已经连上就不再重试了if (this.isConnect) returnthis.initWebSocket()this.reConnectNum = this.reConnectNum + 1},/*webSocket end*/beforeunloadHandler() {this._beforeUnload_time = new Date().getTime();},unloadHandler(e) {this._gap_time = new Date().getTime() - this._beforeUnload_time;// debugger// 关闭或刷新窗口都保存数据到后台// 判断窗口是关闭还是刷新if (this._gap_time <= 5) {// 关闭连接this.webstock.close()} }},created() {this.reConnectNum = 1this.initWebSocket()},mounted() {window.addEventListener("beforeunload", e => this.beforeunloadHandler(e))window.addEventListener("unload", e => this.unloadHandler(e))},destroyed() {this.$destroy()clearInterval(this.timer) // 清除定时器// 页面销毁时关闭长连接// if (this.webstock !== null) {//   this.webstock.close()// } window.removeEventListener("beforeunload", e => this.beforeunloadHandler(e))window.removeEventListener("unload", e => this.unloadHandler(e))}
}
</script>

问题一、

报错信息如下:socketReport.vue?8285:51 Uncaught DOMException: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.

要明白这个问题产生的原因,就需要了解websocket的几个状态。通常在实例化一个websocket对象之后,客户端就会与服务器进行连接。但是连接的状态是不确定的,于是用readyState属性来进行标识。它有四个值,分别对应不同的状态:

CONNECTING:值为0,表示正在连接;
OPEN:值为1,表示连接成功,可以通信了;
CLOSING:值为2,表示连接正在关闭;
CLOSED:值为3,表示连接已经关闭,或者打开连接失败。

这样问题的原因就很明显了,之所以数据不能发送出去,是因为websocket还处在“CONNECTING”状态下,连接还没有成功。

解决办法

只要在函数中添加对状态的判断,在状态为OPEN时,执行send方法即可。方法一代码如下

this.init()
if (this.webstock.readyState===1) {this.webstock.send()
}

问题二、vue项目中监听电脑网络的状态,突然断开网络或者关机

写法一、

 data() {return {network: true, //默认有网}
}
mounted() {window.addEventListener("online", () => {console.log("网络已连接:")this.network = true})// 检测断网window.addEventListener("offline", () => {console.log("已断网:")this.network = falseif (this.webstock !== null) {this.webstock.close()}    })
}

控制台打印的结果:

断开网络的情况

再次连接网络:

写法二、

data() {return {onLine: navigator.onLine,}
}
    mounted() {console.log('this.onLine:', this.onLine)window.addEventListener('beforeunload', e => this.beforeunloadHandler(e))window.addEventListener('unload', e => this.unloadHandler(e))}
    beforeDestroy(){window.removeEventListener('online', this.updateOnlineStatus);window.removeEventListener('offline', this.updateOnlineStatus);},
 // 检测断网updateOnlineStatus(e) {const { type } = e// this.onLine = type === 'online'if (type === 'online') {// 网络已连接console.log("网络已连接:")this.$emit('fatherMethod')if (window.location.pathname === '/newReport' || window.location.pathname === '/c3analysis') {if (!this.unLock){this.reConnect()}}} else if (type === 'offline') {// 已断网console.log("已断网:")if (this.webstock !== null) {this.webstock.close()} }},

相关文章:

websocket每隔5秒给服务端send一次信息

websocket轮询每隔5秒给服务端send一次信息&#xff0c;主要功能点如下&#xff1a;socket 采用了定时器 setInterval&#xff08;&#xff09; 需要清除定时器否则会报错监听了突然关闭浏览器窗口&#xff0c;destroyed里面直接监听 window.removeEventListener("beforeu…...

2023年中职网络安全——SQL注入测试(PL)解析

SQL注入测试(PL) 任务环境说明: 服务器场景:Server2312服务器场景操作系统:未知(关闭链接)已知靶机存在网站系统,使用Nmap工具扫描靶机端口,并将网站服务的端口号作为Flag(形式:Flag字符串)值提交。访问网站/admin/pinglun.asp页面,此页面存在SQL注入漏洞,使用排…...

利用蜜罐捕捉攻击实验(31)

预备知识 1、蜜罐的含义和作用 蜜罐(Honeypot)是一种在互联网上运行的计算机系统。它是专门为吸引并诱骗那些试图非法闯入他人计算机系统的人(如电脑黑客)而设计的&#xff0c;蜜罐系统是一个包含漏洞的诱骗系统&#xff0c;它通过模拟一个或多个易受攻击的主机&#xff…...

PyTorch深度学习实战 | 自然语言处理与强化学习

PyTorch是当前主流深度学习框架之一&#xff0c;其设计追求最少的封装、最直观的设计&#xff0c;其简洁优美的特性使得PyTorch代码更易理解&#xff0c;对新手非常友好。本文主要介绍深度学习领域中自然语言处理与强化学习部分。自然语言区别于计算机所使用的机器语言和程序语…...

测牛学堂:接口测试基础理论和工具的使用

接口测试流程总结 1 需求分析&#xff0c;看产品经理的需求文档 2 接口文档解析&#xff0c;开发编写的api接口文档 3 设计测试用例 4脚本开发 5 执行及缺陷跟踪 6 生成测试报告 7接口自动化持续集成 测试解析接口文档 接口文档&#xff0c;又称为api文档&#xff0c;是由后…...

定长内存池的实现

解决的是固定大小的内存申请释放需求&#xff1a; 性能达到极致不考虑内存碎片问题(统一使用自由链表管理还回来的空间) 为了避免命名污染&#xff0c;不要直接using namespace std;只展开常用的。 #include <iostream> using std::cout; using std::endl;申请空间时有…...

三更草堂springSecurity的学习

源码地址&#xff1a;学习springSecurity (gitee.com) git&#xff1a;https://gitee.com/misszyg/spring-security.git 一&#xff0c;认证流程 1&#xff0c;经过UsernamePasswordAuthenticationFilter &#xff08;1&#xff09;传入了用户的账号&#xff0c;密码 源码&a…...

【C语言】指针的深度理解(一)

前言 我们已经了解了指针的概念&#xff0c;一是指针变量是用来存放地址的&#xff0c;每个地址都对应着唯一的内存空间。二是指针的大小是固定的4或8个字节&#xff08;取决于操作系统&#xff0c;32位的占4个字节&#xff0c;64位的占8个字节&#xff09;。三是指针是有类型…...

Kafka最佳实践

前言 Kafka 最佳实践&#xff0c;涉及 典型使用场景Kafka 使用的最佳实践 Kafka 典型使用场景 Data Streaming Kafka 能够对接到 Spark、Flink、Flume 等多个主流的流数据处理技术。利用 Kafka 高吞吐量的特点&#xff0c;客户可以通过 Kafka 建立传输通道&#xff0c;把应…...

入门教程: 认识 React用于构建用户界面的 JavaScript 库

课前准备 我们将会在这个教程中开发一个小游戏。你可能并不打算做游戏开发,然后就直接跳过了这个教程——但是不妨尝试一下!你将在该教程中学到关于构建 React 应用的基础知识,掌握这些知识后,你将会对 React 有更加深刻的理解。 这篇教程分为以下几个部分: 环境准备是学…...

极紫外光源高次谐波发生腔不同区域真空度精密控制解决方案

摘要&#xff1a;在高次谐波发生器中一般包含两个不同真空区域&#xff0c;一个是1~100Torr绝压范围的气池内部的低真空区域&#xff0c;一个是高阶谐波光路上的绝压为0.001Pa量级的高真空区域。本文针对此两个区域的真空度控制提出了相应的解决方案&#xff0c;特别是详细介绍…...

「Vue面试题」在vue中为什么data属性是一个函数而不是一个对象

文章目录一、实例和组件定义data的区别二、组件data定义函数与对象的区别三、原理分析四、结论一、实例和组件定义data的区别 vue实例的时候定义data属性既可以是一个对象&#xff0c;也可以是一个函数 const app new Vue({el:"#app",// 对象格式data:{foo:"…...

如何使用 ChatGPT 编写 SQL JOIN 查询

通过清晰的示例和解释&#xff0c;本文展示了 ChatGPT 如何简化和简化创建复杂 MySQL 查询的过程&#xff0c;使用户更容易与数据库交互并检索他们需要的数据。无论您是初学者还是经验丰富的开发人员&#xff0c;本文都提供了有关如何利用 ChatGPT 来增强您的 MySQL 查询编写技…...

vue2+elementUI完成添加学生删除学生案列

效果图&#xff1a; 点击添加学生按钮&#xff0c;弹出Dialog,收集用户信息&#xff1a; el-table中自定义复选框&#xff0c;选中一行&#xff0c;可以点击删除 代码区域&#xff1a;就一个HTML文件 <!DOCTYPE html> <html lang"en"> <head>&…...

对void的深度理解

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; void前言一、 void 关键字二、 void修饰函数返回值和参数三、void指针3.1void * 定义的…...

哪款游戏蓝牙耳机好用?好用的游戏蓝牙耳机推荐

现在&#xff0c;不少人喜欢戴蓝牙耳机玩游戏&#xff0c;而在戴蓝牙耳机玩游戏时难免会产生音画不同步的问题。现在越来越多的蓝牙耳机支持游戏模式&#xff0c;那么&#xff0c;哪款游戏蓝牙耳机好用&#xff1f;接下来&#xff0c;我来给大家推荐几款好用的游戏蓝牙耳机&…...

求职(怎么才算精通JAVA开发)

在找工作的的时候,有时候我们需要对自己的技术水平做一个评估。特别是Java工程师,我们该怎么去表达自己的能力和正确认识自己所处的技术水平呢。技术一般的人,一般都不敢说自己精通JAVA,因为你说了精通JAVA几乎就给了面试官一个可以随便往死里问的理由了。很多不自信的一般…...

C++网络编程(三)IO复用

C网络编程(三)IO复用 前言 多进程/多线程网络服务端在创建进程/线程时&#xff0c;CPU和内存开销很大。因为多线程/进程并发模型&#xff0c;为每个socket分配一个线程/进程。而IO复用采用单个的进程/线程就可以管理多个socket。 select 系统调用原型&#xff1a; #includ…...

第十四届蓝桥杯(第三期)模拟赛试题与题解 C++

第十四届蓝桥杯&#xff08;第三期&#xff09;模拟赛试题与题解 C 试题 A 【问题描述】 请找到一个大于 2022 的最小数&#xff0c;这个数转换成十六进制之后&#xff0c;所有的数位&#xff08;不含前导 0&#xff09;都为字母&#xff08;A 到 F&#xff09;。  请将这个…...

【Hive 基础】-- 数据倾斜

1.什么是数据倾斜&#xff1f;由于数据分布不均匀&#xff0c;导致大量数据集中到一点&#xff0c;造成数据热点。常见现象&#xff1a;一个 hive sql 有100个 map/reducer task&#xff0c; 有一个运行了 20分钟&#xff0c;其他99个 task 只运行了 1分钟。2.产生数据倾斜的原…...

计算机网络笔记——物理层

计算机网络笔记——物理层2. 物理层2.1 通信基础2.1.1 信号2.1.2 信源、信道及信宿2.1.3 速率、波特及码元2.1.4 带宽2.1.5 奈奎斯特定理采样定理奈奎斯特定理2.1.6 香农定理2.1.7 编码与调制调制数字信号调制为模拟信号模拟数据调制为模拟信号编码数字数据编码为数字信号模拟数…...

算法第十七期——状态规划(DP)之动态压缩

一、总述 状态压缩动态规划&#xff0c;就是我们俗称的状压DP&#xff0c;是利用计算机二进制的性质来描述状态的一种DP方式。 应用背景&#xff1a;以集合为状态&#xff0c;且集合可以用二进制来表示&#xff0c;用二进制的位运算来处理。集合问题一般是指数复杂度的&#x…...

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A模块第八套解析(详细)

2022年全国职业院校技能大赛(中职组) 网络安全竞赛试题 (8) (总分100分) 赛题说明 一、竞赛项目简介 “网络安全”竞赛共分A.基础设施设置与安全加固;B.网络安全事件响应、数字取证调查和应用安全;C.CTF夺旗-攻击;D.CTF夺旗-防御等四个模块。根据比赛实际情况,竞…...

【华为OD机试真题 JAVA】数组中是否存在满足规则的数字组合

标题:数组中是否存在满足规则的数字组合 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限 给定一个正整数数组,检查数组中是否存在满足规则的数字组合 * 规则: * A = B + 2C 输入描述: * 第一行输出数组的元素个数。 * 接下来一行输出所有数组元素,用空格…...

【OpenCV技能树】——OpenCV基础

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; 目前正在进行 OpenCV技能树的学习&#xff0c;OpenCV是学习图像处理理论知识比较好的一个途径&#xff0c;至少比看书本来得实在。本专栏文章主要记录学习Op…...

人体姿态识别

自留记录论文阅读,希望能了解我方向的邻域前沿吧 粗读,持续更新 第一篇 ATTEND TO WHO YOU ARE: SUPERVISING SELF-ATTENTION FOR KEYPOINT DETECTION AND INSTANCE-AWARE ASSOCIATION 翻译:https://editor.csdn.net/md?not_checkout=1&spm=1001.2014.3001.5352&…...

ubuntu下调试驱动

使用 Ubuntu Linux 测试 Linux 驱动 1. 测试 Linux 驱动准备工作 ​ 对于一个 Linux 驱动程序&#xff0c;一开始可以在 Ubuntu Linux 上做前期开发和测试。对于访问硬件部分也可以在 Ubuntu Linux 用软件进行模拟,切记不能代替真实的环境&#xff01;当基本开发完成后&#…...

第十四届蓝桥杯三月真题刷题训练——第 9 天

第 1 题&#xff1a;找素数 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 素数就是不能再进行等分的整数。比如&#xff1a;7&#xff0c;11。而 9 不是素数&#xff0c;因为它可以平分为 3 等份。一般认为最小的…...

操作系统复习

熟练掌握操作系统的定义&#xff0c;操作系统的特征&#xff0c;操作系统的功能熟练掌握多道程序设计的概念&#xff0c;单道程序设计和多道程序设计的区别&#xff0c;多道程序设计的优点熟悉操作系统接口的主要功能&#xff0c;系统调用的基本概念、类型、实现。操作系统接口…...

springboot健身房管理系统

springboot健身房管理系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xf…...

wordpress中文主题购买/东莞网站推广优化网站

撰文 / 张楠编辑 / 李幼薇01都在骂&#xff0c;都在买“大家都在骂iPhone&#xff0c;但预购时身体却都很诚实。”苹果经销商王绍在朋友圈写道。他告诉「Wise财经」&#xff0c;iPhone 12系列虽然骂的人居多&#xff0c;但大家似乎都在用脚投票。“究竟iPhone 12系列好不好&…...

狐表做网站/网站推广公司大家好

1 class和struct的区别和联系 在c中&#xff0c;class和struct只有一点不同&#xff0c;它们是可以完全替代使用的。唯一的不同在于&#xff0c;class中的成员默认是private的&#xff0c;而struct中默认是public的。 2 指针和引用的不同 2.1 引用在编译后&#xff0c;本质上还…...

合肥网站seo服务/如何优化关键词排名到首页

剑指 Offer 10- II. 青蛙跳台阶问题 题目链接&#xff1a;题目链接 这个题和斐波那契数列是一个问题&#xff0c;用的是斐波那契的递推公司。经典爬楼梯问题 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答…...

网站建设价格评审资料清单/如何找客户资源

在使用boost时,使用异步模式多线程. 程序退出时有一个坑. 就是存在一种情况, 当网络模块释放资源后, 一些收发函数还在做处理. 如果收发函数使用了网络模块里面的资源. 那么就会出现内存泄漏问题. 所以一个解决办法就是,在网络函数收发没有完全关闭之前,不要进行资源的清理. 也…...

led照明企业网站模板/正规代运营公司

首先什么是kobject&#xff1a;kobject是设备模型的核心 内核中很多地方都需要跟踪记录C语言中结构的实例&#xff08;借鉴C对象&#xff0c;内核里面有许多的结构体实例化&#xff09;&#xff0c;尽管这些对象的用法大不相同&#xff0c;但各个不同子系统的某些操作非常相似…...

重庆网站设计平台/痘痘怎么去除有效果

知识点: Canvas():创建一个空的画布&#xff0c;可以使用setBitmap()方法来设置具体的画布 Canvas(Bitmap bitmap):以bitmap对象创建一个画布&#xff0c;则将内容都绘制在Bitmap上&#xff0c;因此bitmap不能为Null Canvas(GL gl):在绘制3D效果时使用&#xff0c;与OpenGL相关…...