【问题标题】:socket.io rejoin rooms on reconnectsocket.io 在重新连接时重新加入房间
【发布时间】:2016-05-26 12:54:58
【问题描述】:

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

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

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

【问题讨论】:

  • 找到这方面的任何信息?我自己也想知道同样的事情
  • @AugieGardner 请检查我的答案。
  • 您可能会发现disconnecting 事件很有帮助,您可以在其中列出您的套接字由于断开连接而离开的房间。文档:socket.io/docs/server-api/…

标签: socket.io


【解决方案1】:

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

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

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

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

【讨论】:

  • 最后我是在客户端完成的。只是想知道 Socket.io 是否有一些内部机制。谢谢
  • 我明白了。 :-) 我认为创建一个内部机制的挑战在于 socket.io 必须在服务器 RAM 中建立一个包含其套接字 ID 和房间的客户端列表。这意味着您必须添加自己的垃圾收集,这意味着向数据添加过期时间。一旦你这样做了,无论如何你都必须添加一个重新连接策略(如果套接字在他们的“房间会话”过期后重新连接)。
  • 就您所说的从台式机和笔记本电脑连接而言,我订阅了两次,一次使用“app”+ yourkey,另一次使用“desktop”+ yourkey。桌面和移动设备同时更新。
  • 我觉得@Raz 的回答更好
【解决方案2】:

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

客户端:

// the next 3 functions will be fired automatically on a disconnect.
// the disconnect (the first function) is not required, but you know, 
// you can use it make some other good stuff.

socket.on("disconnect", function() {
  console.log("Disconnected");
});

socket.on("reconnect", function() {
  // do not rejoin from here, since the socket.id token and/or rooms are still
  // not available.
  console.log("Reconnecting");
});

socket.on("connect", function() {
  // thats the key line, now register to the room you want.
  // info about the required rooms (if its not as simple as my 
  // example) could easily be reached via a DB connection. It worth it.
  socket.emit("registerToRoom", $scope.user.phone);
});

服务器端:

io.on('connection', function(socket){
      socket.on("registerToRoom", function(userPhone) {   
    socket.join(userPhone);   
  });
});

就是这样。非常简单直接。

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

【讨论】:

    【解决方案3】:

    Socket.io 确实有一个 reconnect 事件 - Docs here

    类似下面的东西应该可以工作

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

    尝试重新连接回调看起来像:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-12
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 2015-04-03
      • 2012-03-28
      • 1970-01-01
      相关资源
      最近更新 更多