websocket 发送给前端一个对象_前端WebSocket封装

场景1: 只有单个长链接,不要求保活

class WebSocketClass {

constructor() {

this.instance = null;

this.connect();

}

static getInstance() {

if (!this.instance) {

this.instance = new WebSocketClass();

}

return this.instance;

}

connect() {

this.ws = new WebSocket('ws://xxxxxx');

this.ws.onopen = e => {

this.status = 'open';

console.log(`${name}连接成功`, e);

};

}

getMessage() {

this.ws.onmessage = e => {

console.log(e.data);

return e.data;

};

}

close() {

this.ws.send('close');

this.ws.close();

console.log('close');

}

}

export default new WebSocketClass();

复制代码

调用方法:

import WebSocketClass from '@/services/webSocket';

var ws = WebSocketClass;

console.log(ws.getMessage());

复制代码

关闭方法:

import WebSocketClass from '@/services/webSocket';

var ws = WebSocketClass;

ws.close();

复制代码

场景2: 多个长链接共存

如果还是需要单例调用的话,直接用上面单个模式创建,有几个创建几个,如果不需要保证单例的话:

class WebSocketClass {

constructor(name) {

this.connect(name);

}

connect(name) {

this.ws = new WebSocket(name);

this.ws.onopen = e => {

this.status = 'open';

console.log(`${name}连接成功`, e);

};

}

getMessage() {

this.ws.onmessage = e => {

console.log(e.data);

return e.data;

};

}

close() {

this.ws.send('close');

this.ws.close();

console.log('close');

}

}

export default WebSocketClass;

复制代码

调用方式:

import WebSocketClass from '@/services/webSocket';

var ws = new WebSocketClass('ws://xxxxx');

console.log(ws.getMessage());

复制代码

关闭:这种情况就无法跨域关闭了,只能在哪里开的在哪里关,不然是关不了的,拿不到创建的时候的ws长链接对象。

保活

保活的原理-->心跳,前端每隔一段时间发送一段约定好的message给后端,后端收到后返回一段约定好的message给前端,如果多久没收到前端就调用重连方法进行重连。

import { message } from 'antd';

class WebSocketClass {

constructor() {

this.instance = null;

this.connect();

}

static getInstance() {

if (!this.instance) {

this.instance = new WebSocketClass();

}

return this.instance;

}

connect() {

this.ws = new WebSocket('ws:xxxxx');

this.ws.onopen = e => {

this.status = 'open';

message.info('连接成功');

console.log(`连接成功`, e);

this.heartCheck();

this.getMessage();

};

}

heartCheck() {

// 心跳机制的时间可以自己与后端约定

this.pingPong = 'ping'; // ws的心跳机制状态值

this.pingInterval = setInterval(() => {

if (this.ws.readyState === 1) {

// 检查ws为链接状态 才可发送

this.ws.send('ping'); // 客户端发送ping

}

}, 10000);

this.pongInterval = setInterval(() => {

if (this.pingPong === 'ping') {

this.closeHandle('pingPong没有改变为pong'); // 没有返回pong 重启webSocket

}

// 重置为ping 若下一次 ping 发送失败 或者pong返回失败(pingPong不会改成pong),将重启

console.log('返回pong');

this.pingPong = 'ping';

}, 20000);

}

closeHandle(e = 'err') {

// 因为webSocket并不稳定,规定只能手动关闭(调closeMyself方法),否则就重连

if (this.status !== 'close') {

console.log(`断开,重连websocket`, e);

if (this.pingInterval !== undefined && this.pongInterval !== undefined) {

// 清除定时器

clearInterval(this.pingInterval);

clearInterval(this.pongInterval);

}

this.connect(); // 重连

} else {

console.log(`websocket手动关闭,或者正在连接`);

}

}

getMessage() {

this.ws.onmessage = e => {

if (e.data === 'pong') {

this.pingPong = 'pong'; // 服务器端返回pong,修改pingPong的状态

} else {

message.info(e.data);

}

console.log(e.data);

return e.data;

};

}

close() {

clearInterval(this.pingInterval);

clearInterval(this.pongInterval);

this.status = 'close';

this.ws.send('close');

this.ws.close();

message.info('已断开连接');

console.log('close');

}

}

export default new WebSocketClass();

复制代码

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

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

相关文章

POJ1683 Puzzlestan ——Floyd传递闭包+Dfs

好久没写Dfs了,拿来练手。 WA了一次,没有判断中间的情况…… 解法:先用Floyd传递闭包处理哪些点一定要在一起、哪些点一定不能在一起,六重循环。 然后深搜,res[i][j]表示1,i这个物品在j这一行的匹配物品列编号。 没有最…

中service层的作用_浅析Java中dto、dao、service、controller的四层结构

目前我所在的项目组采用的是SpringBoot框架,前端使用BootStrapjQuery。SpringBoot是BS开发框架之一,不用单独开启tomcat服务器,目前比较流行,一般开发大型项目时会将所有的功能细分为许多小模块,每个模块都有dto、dao、…

SCCM 2007系列教程之六使用组策略实现SCCM客户端

SCCM 2007 安装光盘上提供了名为 ConfigMgr2007Installation.adm 的组策略管理模板,可用于配置客户端计算机的安装属性。1、使用 Windows 组策略对象编辑器等编辑器来将管理模板 ConfigMgr2007Installation.adm 导入新的或现有的组策略对象。(此文件可以…

强化学习

机器学习算法完整版见fenghaootong-github 强化学习原理(RL) RL与有监督学习、无监督学习的比较: 有监督的学习是从一个已经标记的训练集中进行学习,训练集中每一个样本的特征可以视为是对该situation的描述,而其labe…

python的tool模块_barktools-包含各种有用的python模块和脚本的包-Oscar Bark Modules Scripts...

作者:Oscar Bark### 作者邮箱:kurshid.ognianovprotonmail.com### 首页:https://github.com/BarkenBark/python-tools### 文档:None### 下载链接# barktoolsA collection of utilities I find useful. Yes.Modulesbase_utilsA collection of modules which only depend on the …

非常不错的Nodejs工具:http-console

http-console是一个用nodejs写的类似于CURL的第三方库文件. 可以很直观的发送http请求以及查看返回结果. 安装需求: 1, 安装nodejs 2, 安装npm 3, npm install http-console 我做了个简单的例子: 启动: http-console 127.0.0.1:3000 1, HTTP GET: http://127.0.0.1:3000/&g…

bzoj1058: [ZJOI2007]报表统计

哈哈set卡时过了。 set求前驱的方法:*--b.lower_bound(x) (想想写了splay的肉老师就很愉悦啊) 弄两个set,一个记录的是位置的值,一个是差值,MIN_SORT_GAP就很简单啊,插入的时候找前驱后继&#…

javascript对象包含哪些要素_重学JavaScript 对象

栏目为大家介绍JavaScript的对象,重新认识。这里我们继续学习两个比较重要的类型,就是 Object 和 Symbol。我们主要讲的是 Object,相对 Object 来说 Symbol 只是一个配角。关于对象这个概念大家非常早就会接触到了,其实人大概在 5…

【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!...

Himi 原创, 欢迎转载,转载请在明显处注明! 谢谢。 原文地址:http://blog.csdn.net/xiaominghimi/article/details/6937097 终于在11月公司的游戏即将上线了,那么对于iOS游戏来说当今都是内置道具收费属于主流&#xf…

「BZOJ2879」[Noi2012]美食节

这道题就是 「BZOJ1070」[SCOI2007]修车 的加强版 如果一开始把全部边连上会T 优化的方法是只连用到过和下一次增广可能用到的边。 1 #include<bits/stdc.h>2 using namespace std;3 const int N50,M110,NN100010,oo1e9;4 int n,m,cost[N][M],tot,s,t,p[N],rank[NN],c[NN…

不越狱换壁纸_终于来了!iOS 14.3 正式版,可自动定时换壁纸

嘿嘿&#xff0c;我没有猜错吧&#xff01;iOS 14.3 正式版会在12月15日凌晨时段发布&#xff0c;在前几天我就有提到&#xff0c;这一天会发布&#xff0c;主要是与新品 AirPods Max 发售时间与iOS 14.3正式版发布时间一致。其次这次发布iOS 14.3正式版更新内容与 iOS 14.3 RC…

Hibernate【inverse和cascade属性】知识要点

Inverse属性 Inverse属性&#xff1a;表示控制权是否转移.. true:控制权已转移【当前一方没有控制权】false&#xff1a;控制权没有转移【当前一方有控制权】Inverse属性&#xff0c;是在维护关联关系的时候起作用的。只能在“一”的一方中使用该属性&#xff01;Inverse属性的…

[转]HOWTO do Linux kernel development - take 3 (中文版)

打好linux基础&#xff0c;不断的跟随这篇文章中的建议&#xff0c;适应linux kernel开发的流程。虽然需要很久甚至几年的时间&#xff0c;但我相信坚持就会前进&#xff01;加油&#xff01; HOWTO do Linux kernel development - take 3 (中文版) 译者&#xff1a;张乐 rober…

中list如何清空_如何根据索引删除 list 中的元素

这个问题很简单, 首先想到的就是a list(range(10)) del a[2]这个就可以很方便的删除掉 a 中的第 3 个元素.如果我想删除多个元素怎么办, 比如我想删除第 3, 4, 5, 6 个元素? 这个也很好办:a list(range(10)) del a[2:6]那么我要删除的元素的索引不连续呢? 比如我要删除第 3…

sql server紧急状态下登录脚本

--打开xp_cmdshell功能 EXEC [sys].[sp_configure] configname xp_cmdshell, -- varchar(35)configvalue 1 -- int 4 RECONFIGURE WITH override--修改注册表&#xff0c;修改身份验证为混合验证方式 USE [master] GOEXEC xp_instance_regwrite NHKEY_LOCAL_MACHINE, NSoftwa…

第一次项目之后...

从开始学习php不知不觉已经过去两个多月了&#xff0c;其中经历了各种各样以前没有经历过的生活和学习&#xff0c;在将近三个月的学习生活中我完成了第一个php项目。要说感觉&#xff0c;还真有些奇特&#xff0c;从开始连php是什么到现在能够亲手写出一个像模像样的网站就好像…

查询时拼接两列数据_如何用VBA代码查询两列数据差异?

爱就一个字&#xff0c;我只说一次……北京市第三交通委提醒您&#xff1a;代码千万条&#xff0c;注释第一条&#xff0c;命名不规范&#xff0c;修订两行泪……咳&#xff0c;给大家拜晚年了&#xff0c;再提前祝大家元宵快乐……我们今天和大家分享的内容是如何用VBA代码查询…

setTimeout详解

https://www.cnblogs.com/wzndkj/p/7069331.html 一、setTimeout基础 setTimeout(func|code,delay);第一个参数表示将要推迟的函数名或者一段代码&#xff0c;第二个参数表示推迟执行的毫秒数eg: console.log(1); setTimeout(console.log(2),1000); console.log(3);answer: 1 3…

Kappa电商负责人顾皓澜:电商业务一直保持盈利

Kappa电商负责人顾皓澜&#xff08;TechWeb配图&#xff09; 【TechWeb报道】10月初&#xff0c;闹得沸沸扬扬的淘宝商城事件吸引了无数互联网用户的目光&#xff0c;处于漩涡中心的淘宝商城当仁不让地挤入话题排行榜&#xff0c;商城上大小卖家的命运也牵动了众多消费者的心。…

python abs(3+4j)_表达式 abs(3+4j) 的值为 ____________ 。_学小易找答案

【单选题】REHL6/Centos6中重启网络服的命令是( ) 【单选题】在故障分析时,对变压器,以下说法不正确的是( ) 【填空题】表达式 chr(ord(A)+1) 的值为 ____________________ 。 【填空题】 【简答题】 【简答题】请提交实验报告 【单选题】电力系统发生三相短路时,短路电流知包含…