概述
socket.io 的重连机制是一个可选配的内置功能,它能在网络不稳定或服务器暂时不可用的情况下,自动尝试重新建立连接。以下是触发重连的一些常见情况:
触发重连的情况
1. 网络异常:
当客户端与服务端之间的网络连接中断时,socket.io 会尝试重新连接。这种情况包括但不限于网络断开、Wi-Fi切换、移动数据切换等。
2. 服务端突然断开连接:
如果服务端突然关闭或重启,客户端会检测到连接断开,并尝试重新连接。这种情况可能是由于服务器崩溃、维护或网络故障等原因引起的。
3. ping 超时:
如果客户端在一段时间内没有收到服务端的 ping 心跳包,它会认为连接已断开,并尝试重新连接。
不触发重连的情况
socket.io 的自动重连机制仅在非人为断开时启动,如果客户端调用 socket.disconnect(true) 或 socket.disconnect() 来断开连接,该行为会被视为用户明确要求断开连接,此时 socket.io 便不会进行自动重连。
另外,socket.disconnect(true) 和 socket.disconnect() 这两个方法之间也存在一些细微差异:
socket.disconnect()
默认行为: 它会断开与服务器的连接,但不会清除该 socket 实例的事件监听器或其他配置。
可手动重连: 如果你再次调用 socket.connect(),同一个 socket 实例会重新与服务器建立连接。
场景适用: 当你需要临时断开连接,但可能稍后会重新连接时,使用这个方法更合适。
socket.disconnect(true)
深度断开: 当传入参数 true 时,它不仅会断开与服务器的连接,还会清除该 socket 实例的所有内部状态,包括事件监听器、连接状态等。
不可重连: 这个操作相当于销毁该 socket 实例,无法通过调用 socket.connect() 重新连接。需要重新创建一个新的 socket 实例来建立新的连接。
场景适用: 当你不再需要这个 socket 实例,并希望彻底清理它时,可以使用此方法。
示例代码
我们可以在客户端配置启用自动重连,并设置重连参数,也能监听断开连接、重连成功和重连失败等事件,或是调用 socket.disconnect(true) 主动断开连接并防止重连。
import { io, Socket } from 'socket.io-client';
const HOSTNAME = 'localhost';
const PORT = 3000;
const url = `https://${HOSTNAME}:${PORT}`;
const options: Partial
reconnection: true, // 启用自动重连
reconnectionAttempts: 5, // 最多尝试重连次数
reconnectionDelay: 1000, // 初始重连延迟
reconnectionDelayMax: 5000, // 最大重连延迟
};
const socket: Socket = io(url, options);
socket.on('connect', () => {
console.log('Connected to server');
// 设置五秒后断开连接
setTimeout(() => {
socket.disconnect(); // 断开连接
console.log('Disconnected after 5 seconds');
}, 5000);
});
socket.on('disconnect', (reason: string) => {
console.log('Disconnected from server:', reason);
});
socket.on('reconnect', (attemptNumber: number) => {
console.log('Reconnected to server: attempt', attemptNumber);
});
socket.on('reconnect_error', (error: Error) => {
console.log('Reconnect error:', error);
});
socket.on('reconnect_failed', () => {
console.log('Reconnect failed');
});