socket.io在重新连接时重新连接房间

socket.io在重新连接时重新连接房间,socket.io,Socket.io,我正在编写一个新的SPA应用程序,它将订阅多个房间以更新多种类型的信息 在我的生产设置中,为了提高可靠性,我将在负载平衡器后面使用两台服务器 在断开连接的情况下-客户端是否必须在重新连接事件回调上重新发送房间订阅请求,或者是否有方法让服务器自动重新连接客户端(即使客户端由于服务器故障而重新连接到其他服务器)?Socket.io将在断开连接时从所有房间取消用户订阅。它将从服务器端取消您的订阅。我玩了一下这个。服务器可以将用户的房间存储在redis或用户ID下的数据库中,并在连接时检查该用户是否应该

我正在编写一个新的SPA应用程序,它将订阅多个房间以更新多种类型的信息

在我的生产设置中,为了提高可靠性,我将在负载平衡器后面使用两台服务器


在断开连接的情况下-客户端是否必须在重新连接事件回调上重新发送房间订阅请求,或者是否有方法让服务器自动重新连接客户端(即使客户端由于服务器故障而重新连接到其他服务器)?

Socket.io将在断开连接时从所有房间取消用户订阅。它将从服务器端取消您的订阅。我玩了一下这个。服务器可以将用户的房间存储在redis或用户ID下的数据库中,并在连接时检查该用户是否应该在这些房间中。此时,您的用户可以从服务器端加入它们,而无需从客户端执行任何操作

问题是,必须不断存储和更新此房间列表。这只是另一件必须在后端无缝工作的事情。要考虑所有可能使你的组织混乱的可能性,需要进行大量的测试。比如,如果他们登录到另一台设备,你必须清理房间并放入新的房间,但如果用户再次打开笔记本电脑并重新连接,现在他必须从笔记本电脑返回这些房间。。。这是完全可行/可解决的,但我只是在前端做了这件事:

  // rejoin if there's a disconnect
  mySocket.on('reconnect', () => {
    mySocket.emit('subscribe', 'theRoom')
  })

…没有更多的麻烦。如果您添加了有关为什么需要从服务器执行此操作的更多详细信息….?

Socket.io确实有一个
重新连接
事件-

像下面这样的东西应该可以用

socket.on('reconnect',()=>attemptReconnection())

尝试重新连接回调将类似于:


const attemptReconnection=()=>socket.emit('joinRoom',roomId)

根据我的经验,我发现这是最简单和有用的解决方案:

客户端:

//断开连接时,将自动触发接下来的3个函数。
//断开连接(第一个功能)不是必需的,但您知道,
//你可以用它做一些其他的好东西。
socket.on(“断开”,函数(){
控制台日志(“断开”);
});
socket.on(“重新连接”,函数(){
//不要从此处重新加入,因为socket.id令牌和/或房间仍处于活动状态
//没有。
控制台日志(“重新连接”);
});
socket.on(“连接”,函数(){
//这是关键,现在登记到你想要的房间。
//有关所需房间的信息(如果没有我的房间那么简单
//例如)可以通过DB连接轻松访问。这是值得的。
emit(“registerToRoom”,$scope.user.phone);
});
服务器端:

io.on('connection',函数(socket){
socket.on(“registerToRoom”,函数(用户电话){
socket.join(用户电话);
});
});
就这样。非常简单和直接


您还可以在已连接的套接字(最后一个函数)中添加更多的用户显示更新,例如刷新其索引或其他内容。

找到有关此功能的信息吗?想知道同样的事情myself@AugieGardner请检查我的答案。您可能会发现
断开连接
事件很有帮助,您可以列出因断开连接而离开的房间。医生:最后我是在客户端做的。我只是想知道Socket.io是否有一些内部机制。谢谢,我明白了。:-)我认为建立一个内部机制来实现这一点的挑战是socket.io必须在服务器RAM中建立一个客户机列表,其中包含其套接字id和房间。这意味着您必须添加自己的垃圾收集,这意味着向数据添加过期。一旦你这样做了,你就必须添加一个重新连接策略(如果插座在他们的“房间会话”过期后重新连接)。正如你所说的从台式机和笔记本电脑连接,我将订阅两次,一次使用“应用程序”+你的密钥,另一次使用“台式机”+你的密钥。而且桌面和手机都可以一次更新。我认为@Raz的答案更好