class socketIO { constructor(data, time, url, heartbeat) { this.socketTask = null; this.is_open_socket = false; //避免重复连接 this.heartbeat = heartbeat ? heartbeat : 0; this.url = url; this.data = data ? data : null; this.connectNum = 10; // 重连次数 this.traderDetailIndex = 100; // traderDetailIndex ==2 重连 this.accountStateIndex = 100; // accountStateIndex ==1 重连 this.followFlake = true; // followFlake == true 重连 //心跳检测 this.timeout = time ? time : 58000; //多少秒执行检测 this.heartbeatInterval = null; //检测服务器端是否还活着 this.reconnectTimeOut = null; //重连之后多久再次重连 } // 进入这个页面的时候创建websocket连接【整个页面随时使用】 connectSocketInit(data) { this.data = data; this.socketTask = uni.connectSocket({ url: this.url, success: () => { console.log('正准备建立websocket中...'); // 返回实例 return this.socketTask; } }); this.socketTask.onOpen((res) => { this.connectNum = 1; console.log('WebSocket连接正常!'); this.send(data); clearInterval(this.reconnectTimeOut); clearInterval(this.heartbeatInterval); this.is_open_socket = true; this.start(); // 注:只有连接正常打开中 ,才能正常收到消息 this.socketTask.onMessage((e) => { // 字符串转json let res = e.data; console.log('res---------->', res); // 这里 查看 推送过来的消息 if (res) { uni.$emit('getPositonsOrder', res); } }); }); // 监听连接失败,这里代码我注释掉的原因是因为如果服务器关闭后,和下面的onclose方法一起发起重连操作,这样会导致重复连接 uni.onSocketError((res) => { console.log('WebSocket连接打开失败,请检查!'); this.socketTask = null; this.is_open_socket = false; clearInterval(this.heartbeatInterval); clearInterval(this.reconnectTimeOut); // uni.$off('getPositonsOrder'); if (this.connectNum < 6) { uni.showToast({ title: `WebSocket连接失败,正尝试第${this.connectNum}次连接`, icon: 'none' }); this.reconnect(); this.connectNum += 1; } else { uni.$emit('connectError'); this.connectNum = 1; } }); // 这里仅是事件监听【如果socket关闭了会执行】 this.socketTask.onClose(() => { console.log('已经被关闭了-------'); clearInterval(this.heartbeatInterval); clearInterval(this.reconnectTimeOut); this.is_open_socket = false; this.socketTask = null; // uni.$off('getPositonsOrder'); if (this.connectNum < 6) { console.log('执行重连了', this.connectNum); this.reconnect(); } else { console.log('没执行重连了', this.connectNum); uni.$emit('connectError'); uni.$off('getPositonsOrder'); this.connectNum = 1; } }); } // 主动关闭socket连接 Close() { if (!this.is_open_socket) { return; } this.socketTask.close({ success() { // uni.showToast({ // title: 'SocketTask 关闭成功', // icon: 'none' // }); } }); } //发送消息 send(data) { console.log('data---------->', data, typeof data); // 注:只有连接正常打开中 ,才能正常成功发送消息 if (this.socketTask) { this.socketTask.send({ data: typeof data === 'object' ? JSON.stringify(data) : data, async success() { console.log('消息发送成功'); } }); } } //开启心跳检测 start() { this.heartbeatInterval = setInterval(() => { this.send(this.heartbeat ? this.heartbeat : 0); }, this.timeout); } //重新连接 reconnect() { //停止发送心跳 clearInterval(this.heartbeatInterval); //如果不是人为关闭的话,进行重连 if (!this.is_open_socket && (this.traderDetailIndex == 2 || this.accountStateIndex == 0 || this.followFlake)) { this.reconnectTimeOut = setInterval(() => { this.connectSocketInit(this.data); console.log('触发重连'); }, 5000); } } /** * @description 将 scoket 数据进行过滤 * @param {array} array * @param {string} type 区分 弹窗 openposition 分为跟随和我的 */ arrayFilter(array, type = 'normal', signalId = 0) { let arr1 = []; let arr2 = []; let obj = { arr1: [], arr2: [] }; arr1 = array.filter((v) => v.flwsig == true); arr2 = array.filter((v) => v.flwsig == false); if (type == 'normal') { if (signalId) { arr1 = array.filter((v) => v.flwsig == true && v.sigtraderid == signalId); return arr1; } else { return arr1.concat(arr2); } } else { if (signalId > 0) { arr1 = array.filter((v) => v.flwsig == true && v.sigtraderid == signalId); obj.arr1 = arr1; } else { obj.arr1 = arr1; } obj.arr2 = arr2; return obj; } } } module.exports = socketIO;