socket.io 重连机制

socket.io 重连机制

概述

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');

});

相关

电动牙刷用完放哪里
be365官网

电动牙刷用完放哪里

📅 08-30 👁️ 5496
苹果x发热严重怎么解决
365allsports

苹果x发热严重怎么解决

📅 10-06 👁️ 3323
微星主板BIOS如何设置U盘启动(详解微星主板BIOS设置U盘启动的步骤及注意事项)