加了心跳检测,还是不停的重连

function cateWebSocket(){
try {
ws = new WebSocket(wsUrl);
initWebSocket();
} catch (e) {
reconnect();
}
}
 
function initWebSocket(){
var msgloc=-1;
console.log("服务状态:连接中");
ws.onopen=function(){
var login_data = {type:"login",roomId:{sp$shopId},name:"管理员",userface:"",role:"member"};
ws.send(JSON.stringify(login_data));
 
heartCheck.reset().start();
};
ws.onmessage=function(e){
console.log(e.data);
var ret = JSON.parse(e.data);
switch(ret["type"]){
case "ping":
 
break;
case "chat":
console.log(ret);
break;
}
 
heartCheck.reset().start();
};
ws.onclose = function(e) {
reconnect(wsUrl);
};
ws.onerror = function() {
reconnect(wsUrl);
};
}
 
function reconnect() {
if(lockReconnect) return;
lockReconnect = true;
//没连接上会一直重连,设置延迟避免请求过多
setTimeout(function () {
cateWebSocket();
lockReconnect = false;
}, 2000);
}
 
//心跳检测
var heartCheck = {
timeout: 20000,//60秒
timeoutObj: null,
serverTimeoutObj: null,
reset: function(){
clearTimeout(this.timeoutObj);
clearTimeout(this.serverTimeoutObj);
return this;
},
start: function(){
var self = this;
this.timeoutObj = setTimeout(function(){
//这里发送一个心跳,后端收到后,返回一个心跳消息,
//onmessage拿到返回的心跳就说明连接正常
if(ws.readyState===1){
var data={type:"pong"};
ws.send(JSON.stringify(data));
}
self.serverTimeoutObj = setTimeout(function(){//如果超过一定时间还没重置,说明后端主动断开了
ws.close();//如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
}, self.timeout);
}, this.timeout);
}
}
已邀请:

yootou

赞同来自:

QQ截图20190306085724.png

如上图的情况 。。谢谢哈。

yootou

赞同来自:

看了workerman-chat聊天室案例,猜测是不是用的服务端发送心跳给客户端?

智佳思远

赞同来自:

需要客户端发心跳

要回复问题请先登录注册