我正在编写一个新的SPA应用程序,该应用程序将订阅多个房间以进行多种类型的信息更新。
在我的生产设置中,我会在负载均衡器后面使用两台服务器以确保可靠性。
如果断开连接 - 客户端是否必须在重新连接事件回调中重新发送房间订阅请求,或者是否有办法让服务器自动重新连接客户端(即使客户端重新连接到其他服务器到期服务器故障)?
答案 0 :(得分:8)
Socket.io将取消订阅断开连接上所有房间的用户。它将取消订阅服务器端。我玩了一下这个。服务器可以将用户的房间存储在redis或用户ID下的数据库中,并在连接时检查该用户是否应该在任何这些房间中。此时,您的用户可以从服务器端加入它们,而无需从客户端执行任何操作。
问题是必须不断存储和更新这个房间列表。这只是另一件必须在后端无缝工作的事情。考虑所有可能导致组织陷入困境的可能性,需要进行大量测试。比如,如果他们登录其他设备,你必须清理房间并换上新房间,但如果用户再次打开他的笔记本电脑并重新连接,现在他必须从他的笔记本电脑回到这些房间。 ......这完全可行/可解决,但我只是在前端做到了这一点:
// rejoin if there's a disconnect
mySocket.on('reconnect', () => {
mySocket.emit('subscribe', 'theRoom')
})
......没有进一步的麻烦。如果您添加了一些有关为什么需要从服务器执行此操作的更多详细信息..?
答案 1 :(得分:2)
根据我的经验,我发现这是最简单有用的解决方案:
客户方:
io.on('connection', function(socket){
socket.on("registerToRoom", function(userPhone) {
socket.join(userPhone);
});
});
服务器端:
__str__
就是这样。非常简单直接。
您还可以在连接的套接字(最后一个函数)中添加对用户显示的更多更新,例如刷新其索引或其他内容。
答案 2 :(得分:1)
Socket.io确实有reconnect
个事件 - Docs here
以下内容应该有效
socket.on('reconnect', () => attemptReconnection())
尝试重新连接回调看起来像:
const attemptReconnection = () => socket.emit('joinRoom', roomId)