websocket封装过程是什么?
Admin 2021-10-20 群英技术资讯 1516 次浏览
今天我们来了解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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要为大家详细介绍了小程序实现滑动块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这篇文章主要为大家详细介绍了JavaScript实现楼层效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
JavaScript是一种前端开发语言,与其他高级语言一样,JavaScript也有new操作符。那么在js中new操作符的作用是什么呢?很多刚接触前端朋友对此都不是很了解,本文详细介绍了js中new操作符的作用,感兴趣的朋友继续往下看吧。
vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用,下面这篇文章主要给大家介绍了关于降低vue-router版本的2种解决方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
这篇文章主要是介绍JavaScript错误捕获的内容,下文有介绍基本使用与逻辑、JavaScript错误捕获特性、错误对象等等内容,对大家学习和理解JavaScript错误捕获有一定的帮助,那么接下来就跟随小编来学习一下吧。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008