仅用于自学。
前端实现WebSocket心跳机制的方法主要是两种:
- 使用
setInterval定时发送心跳包 - 在前端监听到
WebSocket的onClose()事件,重新创建WebSocket连接。
webSocket心跳包是WebSocket协议的保活机制,用于维持长连接。有效的心跳包可以防止长时间不通讯时,WebSocket自动断开连接。
前端实现WebSocket心跳机制的方式。
心跳包是指一定时间间隔内,WebSocket发送的空数据包。
- 客户端定时向服务器发送心跳数据包,以保持长连接。
- 服务器定时向客户端发送心跳数据包,以检测客户端连接是否正常。
- 双向发送心跳数据包。
WebSocket心跳机制原理
- 客户端建立
WebSocket连接。 - 客户端向服务器发送心跳数据包,服务器接收并返回一个表示接收到心跳数据包的响应。
- 当服务器没有及时接收客户端发送的心跳数据包时,服务器会发送一个关闭连接的请求。
- 服务器定时向客户端发送心跳数据包,客户端接收并返回一个表示接收到心跳数据包的响应。
- 当客户端没有及时接收到服务器发送的心跳数据包时,客户端会重新加接
WebSocket.
WebSocket心跳作用
- 保持WebSocket连接不被断开。
- 检测WebSocket连接状态,及时处理异常情况。
- 减少WebSocket连接及服务器资源的消耗。
服务器端(Node.js示例)
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws) {
ws.isAlive = true;
// 设置一个interval定时器,每隔10秒发送一次ping消息
const interval = setInterval(function ping() {
if (ws.isAlive === false) return ws.terminate();
ws.isAlive = false;
ws.ping(null, false, true);
}, 10000);
ws.on('pong', function () {
ws.isAlive = true;
});
// 当连接关闭时清除定时器
ws.on('close', function () {
clearInterval(interval);
});
});
客户端
const ws = new WebSocket('ws://localhost:8080');
ws.onopen = function open() {
console.log('Connected');
// 设置一个interval定时器,每隔10秒发送一次ping消息到服务器
window.setInterval(function ping() {
ws.send(JSON.stringify({ type: 'ping' }));
}, 10000);
};
ws.onmessage = function message(event) {
const data = JSON.parse(event.data);
if (data.type === 'pong') {
// 处理pong消息
console.log('Received pong');
}
};
ws.onclose = function close() {
console.log('Disconnected');
};
ws.onerror = function error() {
console.log('Error');
};