问题:
我正在开发一个 MERN 堆栈应用程序,其中使用 Socket.IO 进行实时通信。一切正常,但当移动设备进入睡眠模式时我遇到了问题。在此状态下,套接字连接似乎被中断。
背景:
我有一个使用 Node.js 和 Socket.IO 的后端设置,在前端,我使用 React 和 useEffect 钩子在组件安装时建立套接字连接。这是我的代码的简化版本:
后端(socket.js):
// ... (previous code)
io.on("connect", (socket) => {
socket.on("join", async () => {
// some code...
} catch (error) {
// handle error...
}
});
前端(product.js):
// ... (previous code)
useEffect(() => {
socket = io();
if (/* some condition */) {
socket.emit("join", {
// some code...
});
// socket open on user join
return () => {
socket.disconnect();
};
}
}, []);
问题:
套接字连接按预期工作,但是当移动设备进入睡眠模式时,连接似乎丢失。我尝试过实现一个解决方案,但我不确定在睡眠模式下保持套接字连接处于活动状态的最佳方法。
请求帮助:
任何帮助或指导将不胜感激。预先感谢!
import { useEffect } from 'react';
import io from 'socket.io-client';
let socket;
const establishSocketConnection = () => {
// Set up socket with necessary configurations
socket = io({ reconnection: true, reconnectionAttempts: Infinity });
// Join the socket room or perform other initialization logic
socket.emit('join', { /* your data */ });
// Handle incoming messages or events
socket.on('message', (data) => {
// Handle incoming messages
console.log('Received message:', data);
});
// Handle reconnection events
socket.on('reconnect', (attemptNumber) => {
console.log(`Reconnected after ${attemptNumber} attempts`);
});
// Handle disconnect events
socket.on('disconnect', (reason) => {
console.log(`Socket disconnected. Reason: ${reason}`);
});
// Periodic keep-alive to prevent connection timeout
const keepAliveInterval = setInterval(() => {
socket.emit('keep-alive');
}, 30000); // Adjust the interval as needed
return () => {
clearInterval(keepAliveInterval);
socket.disconnect();
};
};
const SocketComponent = () => {
useEffect(() => {
// Establish and return cleanup function
return establishSocketConnection();
}, []); // Run only on component mount
return (
// Your component JSX
<div>
{/* Your component content */}
</div>
);
};
export default SocketComponent;
所以试试这个代码兄弟...
重新连接策略: Socket.IO 配置为尝试重新连接 (
reconnection: true
),并进行无限次尝试 (reconnectionAttempts: Infinity
)。
保持活动信号: 每 30 秒向服务器发送定期保持活动信号,以防止连接超时。
清理逻辑:
useEffect
返回的清理函数确保在组件卸载时正确断开套接字并清除保持活动间隔。
事件处理: 适当处理“重新连接”、“断开连接”和“消息”等事件。
确保将此代码集成到您的 React 组件中,并根据您的具体用例和应用程序结构进行调整。此外,在各种设备和浏览器上彻底测试该解决方案,以确保行为一致。
谢谢。