本流程为客户端向服务端定时发送心跳包。
通过执行该流程,服务端认为客户端仍然保持连接;
定时时长不得大于5分钟,如果服务端正确接收到,将返回心跳返回包;
如果没有接收到,服务端将会主动断开连接。
var timeTask = null;
/**
* 每4分钟向服务器发送心跳包
*/
function scheduleTask(){
console.log("开始发送心跳包")
client.write(getHeatBeatMsg());
}
client.on('data', function(data) {
const buf = Buffer.from(data,'utf-8')
const msgType = buf[3]
const msgLenBuf = Buffer.from([buf[4],buf[5],buf[6],buf[7]])
const msgLength = msgLenBuf.readInt32BE(0)
const msgBuf = Buffer.alloc(msgLength)
buf. copy(msgBuf,0,8,msgLength + 8);
switch (msgType){
case 3:
console.log("接收到服务端发送的同步开始返回包,客户端开始定时发送心跳包")
timeTask = setInterval(scheduleTask, 1000*60*4)
break;
default:
break;
}
});
client.on('close', function() {
console.log('连接关闭');
if(timeTask != null){
clearInterval(timeTask)
}
client = net.createConnection(port, host, onConnect);
client.on('error',onError);
});
/**
* 生成心跳包
*/
function getHeatBeatMsg() {
const bufHead = Buffer.from([0,0,1,0]);
const bufMsg = Buffer.alloc(0)
const buflength = Buffer.alloc(4,0)
buflength.writeIntBE(bufMsg.length, 0, 4);
const totalLength = bufHead.length + buflength.length + bufMsg.length;
return Buffer.concat([bufHead,buflength,bufMsg],totalLength);
}
无调用参数。
服务端返回心跳返回包。
返回数据类型为字节流,包括包头和包数据,返回的包类型为心跳返回包。
00 00 01 01 00 00 00 00
返回的包头结构表如下所示:
名称 | 类型 | 长度 | 返回值 |
---|---|---|---|
固定位 | 数字 | 2字节 | 为 00 00 |
版本号 | 数字 | 1字节 | 为 01 |
指令码 | 数字 | 1字节 | 为01,心跳返回包,服务端给客户端的心跳返回包 |
包数据长度 | 数字 | 4字节 | 为包数据段的长度 |
无响应参数