123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- import store from '@/store/index.js'
- import method from '@/common/methodTool'
- let isSocketClose = false; // 是否关闭socket
- let heartbeatInterval = null; // 心跳定时器
- let socketTask = null; // websocket对象
- let againTimer = null; //断线重连定时器
- let url = null;
- /**
- * sockeUrl:websocet的地址
- * */
- const sokcet = (sockeUrl) => {
- url = sockeUrl;
- isSocketClose = false;
- //判断是否有websocet对象,有的话清空
- if (socketTask) {
- socketTask.close();
- socketTask = null;
- clearInterval(heartbeatInterval);
- }
- // 连接
- console.log(url)
- socketTask = uni.connectSocket({
- url: url,
- success(data) {
- console.log("websocket连接成功");
- clearInterval(againTimer) //断线重连定时器
- },
- fail: (err) => {
- console.log("报错", err);
- }
- });
- // 连接打开
- socketTask.onOpen((res) => {
- console.log('WebSocket打开');
- clearInterval(againTimer) //断线重连定时器
- clearInterval(heartbeatInterval);
- // // 30秒发送一次心跳
- // heartbeatInterval = setInterval(() => {
- // sendMsg('心跳ing')
- // }, 30000)
- })
- // 监听连接失败
- socketTask.onError((err) => {
- console.log('WebSocket连接打开失败,请检查', err);
- //停止发送心跳
- clearInterval(heartbeatInterval)
- //如果不是人为关闭的话,进行重连
- if (!isSocketClose) {
- reconnect(url)
- }
- })
- // // 监听连接关闭 -
- socketTask.onClose((e) => {
- console.log('WebSocket连接关闭!',e);
- clearInterval(heartbeatInterval)
- if (!isSocketClose) {
- reconnect(url)
- }
- })
- // 监听收到信息
- socketTask.onMessage((res) => {
- console.log(res, 'res监听收到信息')
-
- if(res.data == 'offLine') {
- stop();
- uni.setStorageSync('needToLogin','1')
- uni.showToast({
- icon:'none',
- title:'用户在其他终端登录,强制下线',
- duration:3000,
- })
- setTimeout(() => {
- method.exit();
- },3000)
- }
- });
- }
- const reconnect = (url) => {
- console.log('进入断线重连', isSocketClose);
- clearInterval(againTimer) //断线重连定时器
- clearInterval(heartbeatInterval);
- console.log(socketTask)
- socketTask && socketTask.close(); // 确保已经关闭后再重新打开
- socketTask = null;
- // 连接 重新调用创建websocet方法
- againTimer = setInterval(() => {
- sokcet(url)
- console.log('在重新连接中...');
- }, 20000)
- }
- const sendMsg = (msg) => { //向后端发送心跳包
- console.log(msg)
- try {
- //通过 WebSocket 连接发送数据
- socketTask.send({
- data:msg
- });
- } catch (e) {
- console.log(e,'msg')
- if (isSocketClose) {
- return
- } else {
- reconnect(url)
- }
- }
- }
- const stop = () => {
- isSocketClose = true
- clearInterval(heartbeatInterval);
- clearInterval(againTimer) //断线重连定时器
- socketTask && socketTask.close(); // 确保已经关闭后再重新打开
- socketTask = null;
- }
- export const websocket = {
- sokcet,
- stop,
- sendMsg
- };
|