websocket封装过程是什么?
Admin 2021-10-20 群英技术资讯 1912 次浏览
今天我们来了解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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
微信小程序实现拍照打卡功能 本文实例为大家分享了微信小程序实现拍照打卡的具体代码,供大家参考,具体内容如下 由于拍照组件是相当于一个块,用隐藏显示的方法不太好,为了更好的用户交互,选择了在一个新的页面调用相机组件,上传图片并保存打卡数据的方式. 小程序端 签到页面wxml <view class="signBtn" bindtap="signSubmit"> <view>{{signTime}}</view> <view>打卡签 ...
这篇文章主要为大家介绍了JS继承与工厂构造及原型设计模式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
这篇文章主要介绍了Vue3中的Refs和Ref,文章围绕Vue3中的Refs和Ref得相关资料应用举例烦人方式展开详细内容,需要的朋友可以参考一下
本文主要介绍了冻结JS对象方法技术,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本文实例为大家分享了jquery模拟picker实现滑动选择效果的具体代码,供大家参考,具体内容如下
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
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