// 域名地址(项目实地址) const Host = 'ws://id27149.com:2222/codec'; //codecserver网站 // Socket连接成功 var socketOpen = false; // Socket关闭 var socketClose = false; // 消息队列 var socketMsgQueue = []; // 判断心跳变量 var heart = null; // 心跳失败次数 var heartBeatFailCount = 0; // 终止心跳 var heartBeatTimeout = null; // 终止重连 var connectSocketTimeout = null; var webSocket = { // 连接Socket connectSocket:function(sever_url, success_cb, fail_cb) { wx.showLoading({ title: '正在请求中', mask: true, }); socketOpen = false; socketClose = false; socketMsgQueue = []; wx.connectSocket({ url:sever_url, success:function(res) { if (success_cb) { success_cb(res); } }, fail:function(res) { if (fail_cb) { fail_cb(res); } } }) }, // 发送消息 SocketTxMsg:function(msg, success_cb, fail_cb) { if (socketOpen) { wx.sendSocketMessage({ data: msg, success: function(res) { if (success_cb) { success_cb(res); } }, fail: function(res) { if (fail_cb) { fail_cb(res); } } }) } else { socketMsgQueue.push(options.msg) } }, // 关闭Socket closeSocket: function(success_cb, fail_cb) { if (connectSocketTimeout) { clearTimeout(connectSocketTimeout); connectSocketTimeout = null; }; socketClose = true; this.stopHeartBeat(); wx.closeSocket({ success: function(res) { if (success_cb) { success_cb(res); } }, fail: function(res) { if (fail_cb) { fail_cb(res); } } }) }, // 收到消息 onSocketMessageCallback: function(msg) { console.log("收到服务器消息:", msg) }, // 开始心跳 startHeartBeat: function() { heart = true; this.heartBeat(); }, // 正在心跳 heartBeat: function() { console.log("启动心跳") // 与后端约定,传点消息,保持链接 var heartbeat_data = "123456" var that = this; if (!heart) { return; }; if (socketOpen) { wx.sendSocketMessage({ data: JSON.stringify({ "method": "heartbeat", "args": "1234" }), success: function(res) { console.log("心跳发送成功, res:", res) if (heart) { heartBeatTimeout = setTimeout(() => { that.heartBeat(); }, 7000); } }, fail: function(res) { console.log("心跳发送失败, res:", res) if (heartBeatFailCount > 2) { that.connectSocket(); }; if (heart) { heartBeatTimeout = setTimeout(() => { that.heartBeat(); }, 7000); }; heartBeatFailCount++; }, }); }else{ // socketMsgQueue.push(heartbeat_data) } }, // 结束心跳 stopHeartBeat: function() { console.log("结束心跳") heart = false; if (heartBeatTimeout) { clearTimeout(heartBeatTimeout); heartBeatTimeout = null; }; if (connectSocketTimeout) { clearTimeout(connectSocketTimeout); connectSocketTimeout = null; } } }; // 监听WebSocket打开连接 wx.onSocketOpen(function(res) { wx.hideLoading(); // 如果已经关闭socket if (socketClose) { webSocket.closeSocket(); } else { console.log("打开socket成功") socketOpen = true for (var i = 0; i < socketMsgQueue.length; i++) { // webSocket.SocketTxMsg(socketMsgQueue[i], null, null) wx.sendSocketMessage({ data: socketMsgQueue[i], success: function(res) { console.log("send success, res:", res) }, fail: function(res) { console.log("send fail, res:", res) } }) }; socketMsgQueue = [] // webSocket.startHeartBeat(); } }); // 监听WebSocket错误 wx.onSocketError(function(res) { console.log('WebSocket连接打开失败,请检查!', res); }); // 监听WebSocket接受到服务器的消息 wx.onSocketMessage(function(res) { webSocket.onSocketMessageCallback(res.data); }); // 监听WebSocket关闭连接后马上重连 wx.onSocketClose(function(res) { if (!socketClose) { clearTimeout(connectSocketTimeout); connectSocketTimeout = setTimeout(() => { webSocket.connectSocket(); }, 8000); } }); module.exports = webSocket;