>[info] 加心跳包的目的是为了维持链接,正常的聊天室等工具都是依赖心跳包进行一个长连接的维持,前后端都会有相关的代码逻辑处理
前端逻辑代码更新如下所示:
```
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Title</title>
</head>
<body>
<script>
// var ws = new WebSocket('ws://123.56.71.69:1234');
// ws.onopen = function(){
// var uid = '{"id":"uid2","msg":"早安123"}';
// ws.send(uid);
// console.log("给服务端发送一个字符串:"+uid);
// setInterval(function () {
// ws.send(uid);
// console.log("心跳包给服务端发送一个字符串:"+uid);
// }, 20000)
// };
// ws.onmessage = function(e){
// // alert(e.data);
// console.log("收到服务端的消息:" + e.data);
// };
// ws.onerror=function (e) {
// console.log(e);
// }
function longSock(url, fn, intro = '') {
let lockReconnect = false; //避免重复连接
let timeoutFlag = true;
let timeoutSet = null;
let reconectNum = 0;
const timeout = 30000; //超时重连间隔
let ws;
function reconnect() {
if (lockReconnect) return;
lockReconnect = true;
//没连接上会一直重连,设置延迟避免请求过多
if (reconectNum < 3) {
setTimeout(function() {
timeoutFlag = true;
createWebSocket();
console.info(`${intro}正在重连第${reconectNum + 1}次`);
reconectNum++;
lockReconnect = false
},
5000) //这里设置重连间隔(ms)
}
}
//心跳检测
const heartCheck = {
timeout: 5000,
//毫秒
timeoutObj: null,
serverTimeoutObj: null,
reset: function() {
clearInterval(this.timeoutObj);
clearTimeout(this.serverTimeoutObj);
return this
},
start: function() {
const self = this;
let count = 0;
this.timeoutObj = setInterval(() =>{
if (count < 2) {
if (ws.readyState === 1) {
ws.send('HeartBeat');
console.info(`${intro}HeartBeat第${count + 1}次`)
}
count++
} else {
console.log('断线了');
ws.close()
createWebSocket();
// clearInterval(this.timeoutObj);
// count = 0;
// if (ws.readyState === 0 && ws.readyState === 1) {
// ws.close()
// }
}
},
self.timeout)
}
};
const createWebSocket = () =>{
console.info(`${intro}创建11`);
// timeoutSet = setTimeout(() =>{
// if (timeoutFlag && reconectNum < 3) {
// console.info(`${intro}重连22`);
// reconectNum++;
// createWebSocket()
// }
// },
// timeout);
ws = new WebSocket(url);
ws.onopen = () =>{
reconectNum = 0;
timeoutFlag = false;
clearTimeout(timeoutSet);
heartCheck.reset().start()
var uid = '{"id":"uid2","msg":"早安123"}';
ws.send(uid);
console.log("给服务端发送一个字符串:" + uid);
setInterval(function() {
ws.send(uid);
console.log("心跳包给服务端发送一个字符串:" + uid);
},
20000)
};
ws.onmessage = evt =>{
heartCheck.reset().start();
// console.info(evt);
if (evt.data === 'HeartBeat') return;
fn(evt, ws)
};
ws.onclose = e =>{
console.info(`${intro}关闭11`, e.code);
if (e.code !== 1000) {
timeoutFlag = false;
clearTimeout(timeoutSet);
reconnect()
} else {
clearInterval(heartCheck.timeoutObj);
clearTimeout(heartCheck.serverTimeoutObj)
}
};
ws.onerror = function() {
console.info(`${intro}错误11`);
reconnect() //重连
}
};
createWebSocket();
return ws
}
//方法调用
const handler = (evt, ws) => {
//evt 是 websockett数据
//ws 是请求名称,方便关闭websocket
console.log('收到服务端消息'+evt.data)
}
longSock(`ws://123.56.71.69:1234`, handler, '数据大屏');
</script>
</body>
</html>
```