123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- class wsRequest {
- constructor(time) {
- this.status = null; // websocket是否关闭
- this.lockReconnect = false //避免重复连接
- // this.url = url
- //心跳检测
- this.timeout = time //多少秒执行检测
- this.timeoutObj = null //检测服务器端是否还活着
- this.reconnectTimeOutObj = null //重连之后多久再次重连
- try {
- return this.initRequest()
- } catch (e) {
- this.reconnect();
- }
- }
- initRequest() {
- this.socketTask = uni.connectSocket({
- url: 'wss://' + uni.getStorageSync("wsServerUrl") + '/websocket/message/' + uni.getStorageSync(
- 'setUserName'), //接口地址。
- success: () => {
- // 返回实例
- return this.socketTask
- }
- })
- this.socketTask.onOpen(res => {
- // 清除重连定时器
- clearTimeout(this.reconnectTimeOutObj)
- // 开启检测
- this.start()
- })
- // 如果希望websocket连接一直保持,在close或者error上绑定重新连接方法。
- this.socketTask.onClose((res) => {
- console.log(res, '连接关闭');
- this.reconnect();
- })
- this.socketTask.onError((res) => {
- console.log(res, '连接错误');
- this.reconnect();
- })
- this.socketTask.onMessage(res => {
- //接受任何消息都说明当前连接是正常的
- this.reset();
- if (res.data === 'all_Read') {
- uni.setStorageSync('msgData', null)
- } else if (res.data != 'ping') {
- uni.setStorageSync('msgData', res.data)
- } else {
- uni.setStorageSync('msgData', null)
- }
- })
- }
- send(value) {
- return new Promise((resovle, reject) => {
- this.socketTask.send({
- data: value,
- success: () => {
- resovle('发送成功')
- }
- })
- })
- }
- // reset和start方法主要用来控制心跳的定时。
- reset() {
- // 清除定时器重新发送一个心跳信息
- clearTimeout(this.timeoutObj);
- this.start();
- }
- start() {
- this.timeoutObj = setTimeout(() => {
- //这里发送一个心跳,后端收到后,返回一个心跳消息,
- //onmessage拿到返回的心跳就说明连接正常
- this.socketTask.send({
- data: "ping"
- });
- }, this.timeout)
- }
- // 重连
- reconnect() {
- // 防止多个方法调用,多处重连
- if (this.lockReconnect) {
- return;
- };
- this.lockReconnect = true;
- console.log('准备重连');
- //没连接上会一直重连,设置延迟避免请求过多
- this.reconnectTimeOutObj = setTimeout(() => {
- // 重新连接
- this.initRequest()
- this.lockReconnect = false;
- }, 4000);
- }
- // 手动关闭
- close() {
- this.socketTask.close()
- }
- }
- module.exports = wsRequest
|