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

Js WebSocket类,收发Json,带心跳,断线重连

如题
心跳:4秒发一次
断线:2秒后自动重连
收发:发送和返回json,处理粘包断包等情况,json字符串最大长度9999
缓存:未连接时,自动缓存100个包,当连接时会自动发出

JS代码

var MyWebSocket = {ws : null,isConnected : false,strLast : "",isDebug : true,url : "",//msreconnectTimeout : 2000,sendBuffMaxSize : 100,arrSendBuff : [],timer : 0,connect : function(url){this.url = url;var that = this;if( this.ws != null ){this.ws.onopen = null;this.ws.onmessage = null;this.ws.onclose = null;this.ws.onerror = null;}if( this.timer==0 ){timer = setInterval( this.heart, 4000, this );}this.ws = new WebSocket(url);this.ws.onopen = function(){that.isConnected = true;//当WebSocket创建成功时,触发onopen事件that.log("open");that.ws.send("0002{}"); //将消息发送到服务端that.sendBuffJson();}this.ws.onmessage = function(e){that.log(e.data);that.strLast += e.data;var strlen = that.strLast.length;if( strlen > 4 ){var len = parseInt( "0x" + that.strLast.substr(0, 4));if( len+4 <= strlen ){var s = that.strLast.substr(4, len+4);that.strLast = that.strLast.substr(len+4);that.log("msg come");that.log(s);if( that.onMsgCome != null ){this.onMsgCome(JSON.parse(s));}}}}this.ws.onclose = function(e){//当客户端收到服务端发送的关闭连接请求时,触发onclose事件that.log("close");that.isConnected = false;that.reconnect();}this.ws.onerror = function(e){//如果出现连接、处理、接收、发送数据失败的时候触发onerror事件that.log(error);}},reconnect : function(){if( this.reconnectTimeout > 0 ){setTimeout(this.doReconnect, this.reconnectTimeout, this);}else this.doReconnect(this);},doReconnect : function(that){that.connect(that.url);},sendBuffJson : function(){var len = this.arrSendBuff.length;for( var i=0; i<len; i++ ){var json = this.arrSendBuff[i];this.send(json);}return len;},heart : function(that){if( !that.isConnected ) return;that.timerNum++;if( that.timerNum > that.sendNum ){that.log("heart");that.ws.send("0000");}},timerNum : 1,sendNum : 1,send : function(json){if( !this.isConnected ){if( this.arrSendBuff.length < this.sendBuffMaxSize ){this.arrSendBuff.push(json);}return;}this.sendNum = this.timerNum + 1;var s = JSON.stringify(json);var prev = "0000" + s.length.toString(16);prev = prev.substr(prev.length-4);s = prev + s;this.ws.send(s);},log : function(s){if( this.isDebug ) console.log(s);},//信息回调回调函数onMsgCome : null,
}

测试代码

<!DOCTYPE html>
<html>
<head><meta charset=utf-8 /><title>MyWebSocket</title>
</head>
<script type="text/javascript"> </script>
<body><script src="MyWebSocket.js"></script><script>var mw = Object.create(MyWebSocket);mw.connect("ws://127.0.0.1:8888");mw.onMsgCome = function(json){console.log(json);}setInterval(xx, 3000);function xx(){var json = {};json.url = "xx";json.data = {};mw.send(json);}</script></body></html>

相关文章:

Js WebSocket类,收发Json,带心跳,断线重连

如题 心跳&#xff1a;4秒发一次 断线&#xff1a;2秒后自动重连 收发&#xff1a;发送和返回json&#xff0c;处理粘包断包等情况&#xff0c;json字符串最大长度9999 缓存&#xff1a;未连接时&#xff0c;自动缓存100个包&#xff0c;当连接时会自动发出 JS代码 var MyWeb…...

VBA技术资料MF96:单字段多条件高级筛选

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…...

电子取证中Chrome各版本解密Cookies、LoginData账号密码、历史记录

文章目录 1.前置知识点2.对于80.X以前版本的解密拿masterkey的几种方法方法一 直接在目标机器运行Mimikatz提取方法二 转储lsass.exe 进程从内存提取masterkey方法三 导出SAM注册表 提取user hash 解密masterkey文件&#xff08;有点麻烦不太推荐&#xff09;方法四 已知用户密…...

Axure元件基本介绍进阶

Axure元件基本介绍进阶 1.Axure元件基本介绍1.在 Axure 中&#xff0c;元件是构建原型的基本构成单元&#xff0c;能够帮助设计师快速创建、重复使用和管理设计元素。以下是 Axure 中元件的基本介绍&#xff1a;1.基本元件&#xff1a; 2.基本元件的使用一.【举例说明】积木&am…...

安卓11添加切换以太网动态静态方法

客户要在app中自由切换动态&#xff0c;静态方法&#xff0c;直接把系统jar-api给他搞了半天搞不定&#xff0c;只有在系统里给他实现一个接口&#xff0c;方法如下&#xff1a; Index: packages/apps/Settings/AndroidManifest.xml--- packages/apps/Settings/AndroidManifes…...

初级数据结构(五)——树和二叉树的概念

文中代码源文件已上传&#xff1a;数据结构源码 <-上一篇 初级数据结构&#xff08;四&#xff09;——队列 | NULL 下一篇-> 1、树结构&#xff08;Tree&#xff09; 1.1、树结构的特点 自然界中的树由根部开始向上生长&#xff0c;随机长出分支&…...

pdf读取内容缺失(漏字/文字丢失)问题

项目中遇到pdf文件漏字&#xff0c;由于文件涉密&#xff0c;不能展示&#xff0c;简单描述一下&#xff1a; 比如原pff中 姓名&#xff1a;张三 读取结果中&#xff1a;空白&#xff1a;张三 即&#xff1a;原文件说是银行出具的打款证明&#xff0c;银行内部设置了文件权限&a…...

c#面试基础语法——现有⼀个整数number,请写⼀个⽅法判断这个整数是否是2的N次⽅

1.number%20 取余&#xff08;取模&#xff09;只能判断number是不是2的倍数但不一定是2的N次方&#xff0c;如&#xff1a;6%20但是他并不是2的N次方 2.(number&(number-1))0 原理&#xff1a;如果number是2的N次方则表示2进制位只有一位是1。如&#xff1a;2 &#xff08…...

27系列DGUS智能屏发布:可实时播放高清模拟信号摄像头视频

针对高清晰度的模拟信号摄像头视频画面的显示需求&#xff0c;迪文特推出27系列DGUS智能屏。该系列智能屏可适配常见的AHD摄像头、CVBS摄像头&#xff0c;支持单路1080P高清显示、两路720P同屏显示&#xff08;同一类型摄像头&#xff09;。用户通过DGUS简单开发即可实现摄像头…...

YOLOv8改进 | 2023主干篇 | 替换LSKNet遥感目标检测主干 (附代码+修改教程+结构讲解)

一、本文介绍 本文给大家带来的改进内容是LSKNet&#xff08;Large Kernel Selection, LK Selection&#xff09;&#xff0c;其是一种专为遥感目标检测设计的网络架构&#xff0c;其核心思想是动态调整其大的空间感受野&#xff0c;以更好地捕捉遥感场景中不同对象的范围上下…...

【工具】VUE 前端列表拖拽功能代码

【工具】VUE 前端列表拖拽功能代码 使用组件 yarn add sortablejs --save Sortable.js中文网 (sortablejs.com) 以下代码只是举个例子&#xff0c; 大家可以举一反三去实现各自的业务功能 <template><div><el-button type"primary" click"切换…...

人工智能与量子计算:开启未知领域的智慧之旅

导言 人工智能与量子计算的结合是科技领域的一场创新盛宴&#xff0c;引领我们进入了探索未知领域的新时代。本文将深入研究人工智能与量子计算的交汇点&#xff0c;探讨其原理、应用以及对计算领域的深远影响。 量子计算的崛起为人工智能领域注入了新的活力&#xff0c;开启了…...

2023了,前端实现AI电子秤思路分析

前景小知识&#xff1a; 这几年ai这个话题非常火爆&#xff0c;笔者从事零售行业软件开发也接到了新需求&#xff0c;希望实现ai电子秤&#xff0c;老规矩&#xff0c;先看需求 举个栗子&#xff1a; 或许&#xff0c;你已经留意到&#xff0c;当你在某些大型超市超市或生鲜类…...

CSS学习

CSS学习 1. 什么是css?2.css引入方式2.1 内嵌式2.2 外联式2.3 行内式2.4 引入方式特点 3. 基础选择器3.1 标签选择器3.2 类选择器3.3 id选择器3.4 通配符选择器 4. 文字基本样式4.1 字体样式4.1.1 字体大小4.1.2 字体粗细4.1.3 倾斜4.1.4 字体4.1.5 字体font相关属性连写 4.2 …...

Flask基本用法:一个HelloWorld,搭建服务、发起请求

目录 1、简介 2、安装 3、Flask使用示例 参考 1、简介 官网文档 Flask是一个轻量的web服务框架&#xff0c;我们可以利用它快速搭建一个服务&#xff0c;对外提供接口&#xff0c;其他人可以轻松调用我们的服务。这对算法工程师来说比较关键&#xff0c;我们通常不擅长搞开发…...

Tomcat-安装部署(源码包安装)

一、简介 Tomcat 是由 Apache 开发的一个 Servlet 容器&#xff0c;实现了对 Servlet 和 JSP 的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 简单来说&#xff0c;Tomcat是一个WEB应用程序的托管平台…...

【Hadoop_06】MapReduce的概述与wc案例

1、MapReduce概述1.1 MapReduce定义1.2 MapReduce优点1.3 MapReduce缺点1.4 MapReduce核心思想1.5 MapReduce进程1.6 常用数据序列化类型1.7 源码与MapReduce编程规范 2、WordCount案例实操2.1 本地测试2.2 提交到集群测试 1、MapReduce概述 1.1 MapReduce定义 MapReduce是一…...

Qt点击子窗口时父窗口标题栏高亮设计思路

父窗口调用findChildren得到其子孙窗口的列表&#xff0c;列表元素统一为QWidget*&#xff0c;遍历列表元素&#xff0c;每个元素调用installEventFilter&#xff0c;过滤QEvent::FocusIn和QEvent::FocusOut事件&#xff0c;做相应处理即可&#xff1a; QWidget* parent; QLis…...

掌握iText:轻松处理PDF文档-高级篇-添加水印

前言 iText作为一个功能强大、灵活且广泛应用的PDF处理工具&#xff0c;在实际项目中发挥着重要作用。通过这些文章&#xff0c;读者可以深入了解如何利用iText进行PDF的创建、编辑、加密和提取文本等操作&#xff0c;为日常开发工作提供了宝贵的参考和指导。 掌握iText&…...

深度学习基本概念

1.全连接层 全连接层就是该层的所有节点与输入节点全部相连&#xff0c;如图所 示。假设输入节点为X1&#xff0c; X 2&#xff0c; X 3&#xff0c;输出节点为 Y 1&#xff0c; Y 2&#xff0c; Y 3&#xff0c; Y 4。令 矩阵 W 代表全连接层的权重&#xff0c; W 12也就代表 …...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...