| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 | import store from '@/store/index.js'import method from '@/common/methodTool'let isSocketClose = false; // 是否关闭socketlet 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};
 |