websocket封装过程是什么?
Admin 2021-10-20 群英技术资讯 2347 次浏览
今天我们来了解websocket封装的内容,下文给大家分享了websocket封装过程,及引入和使用,需要的朋友可以参考,下面我们一起来学习一下吧。
在一个应用中,websocket一般都是以单例形式存在的,即在整个应用中,websocket实例始终保持唯一。但有时我们要用到websocket实例的时候,可能websocket还没实例化,所以要做成异步的形式来获取实例。
一、封装。先创建 socket.ts 文件
import EventEmitter from 'events'; // 这里用到了 events 包
const ee = new EventEmitter();
class Ws {
private wsUrl: string = '';
private socket: WebSocket | undefined; // socket实例
private lockReconnect: boolean = false; // 重连锁
private timeout: NodeJS.Timeout | undefined;
// 初始化socket,一般在应用启动时初始化一次就好了,或者需要更换wsUrl
public init(wsUrl: string) {
this.wsUrl = wsUrl;
this.createWebSocket();
}
// 获取socket实例
public getInstance(): Promise<WebSocket> {
return new Promise((resolve, reject) => {
if (this.socket) {
resolve(this.socket);
} else {
ee.on('socket', (state: string) => {
if (state === 'success') {
resolve(this.socket);
} else {
reject();
}
});
}
});
}
// 创建socket
private createWebSocket() {
try {
console.log('websocket 开始链接');
const socket = new WebSocket(this.wsUrl);
socket.addEventListener('close', () => {
console.log('websocket 链接关闭');
this.socket = undefined;
this.reconnect();
});
socket.addEventListener('error', () => {
console.log('websocket 发生异常了');
this.socket = undefined;
this.reconnect();
});
socket.addEventListener('open', () => {
// 可在此进行心跳检测
// this.heartCheck.start();
console.log('websocket open');
this.socket = socket;
ee.emit('socket', 'success');
});
socket.addEventListener('message', (event) => {
console.log('websocket 接收到消息', event);
});
} catch (e) {
console.log('socket catch error', e);
this.reconnect();
}
}
// 重连
private reconnect() {
if (this.lockReconnect) {
return;
}
console.log('websocket 正在重新连接');
this.lockReconnect = true;
//没连接上会一直重连,设置延迟避免请求过多
this.timeout && clearTimeout(this.timeout);
this.timeout = setTimeout(() => {
this.createWebSocket();
this.lockReconnect = false;
}, 5000);
}
}
export default new Ws();
二、引入并使用
import socket from '@/utils/ws';
socket
.getInstance()
.then((ws) => {
// 这里的 ws 就是实例化后的 websocket,可以直接使用 websocket 原生 api
console.log('getInstance ws', ws);
ws.addEventListener('message', (event) => {
console.log('ws 接收到消息', event);
});
})
.catch(() => {});
以上就是关于websocket封装过程的介绍啦,本文代码有一定的借鉴价值,有需要的朋友可以参考,希望对大家学习websocket封装有帮助,想要了解更多可以继续浏览群英网络其他相关的文章。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
jquery获取select选中的值示例详解,js获取选中option的value值很简单,下面看本jquery教程的:selected选择器的使用。 html代码部分 selectoptionvalue=1张三/optionoptionvalue=2selected=selected李四/optionoptionvalue=3王五/option/selectbuttonid=getS
javascript取消选中事件的方法:可以通过删除事件处理程序来实现取消选中事件,例如【btn.onclick = null;】。
这篇文章主要为大家详细介绍了微信小程序实现滚动Tab选项卡,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
TypeScript语法详解之类型操作的补充 目录 类型操作的补充 类型断言的使用 非空类型的断言 可选链使用介绍 两个特殊操作符 字面量类型介绍 字面量推理介绍 总结 类型操作的补充 类型断言的使用 有时候TypeScript无法获取具体的类型信息,这个我们需要使用类型断言( Type Assertions). 比如我们在操作DOM的时候, 通过 document.getElementById 获取元素, TypeScript只知道该函数会返回HTMLElement ,但并不知道它具体的类型, 是无法得知具体是img还是div等等: 当我
这篇文章主要介绍了采用React编写小程序的Remax框架的编译流程解析(推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008