chenxiong 3 年 前
コミット
1c8a2acef7
2 ファイル変更138 行追加0 行削除
  1. 137 0
      common/socket.js
  2. 1 0
      pages4/login/login.vue

+ 137 - 0
common/socket.js

@@ -0,0 +1,137 @@
+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
+};

+ 1 - 0
pages4/login/login.vue

@@ -467,6 +467,7 @@ export default {
 	
 	
 	.wxloginBtn{
+		margin:0 auto;
 		background: url("/static/loginBtn.png") no-repeat;
 		background-size:100% 100%;
 		border:none;