【问题标题】:How many times can Socket.io 'connection' and 'disconnection' events be fired for single client?Socket.io 'connection' 和 'disconnection' 事件可以为单个客户端触发多少次?
【发布时间】:2018-08-26 13:29:34
【问题描述】:

编辑:我看到我在服务器上disconnect 的处理程序中得到了ping timeouttransport error 原因。这使得在我的服务器中维护状态变得困难(我试图跟踪哪些用户在类似聊天的设置中连接(。我正在阅读它可能与 Chrome 中的背景选项卡有关(我正在运行). 有人对这些“虚假”断开连接事件有任何经验吗?

我是 Socket.io 的新手,在理解连接和断开连接过程时遇到了一些麻烦。

据我了解,当客户端连接时,服务器会收到一次connection 事件,并且在on.('connection') 的回调中注册该客户端的所有处理程序。这是真的吗?

我想维护一个已连接的用户,因此我在 connection 处理程序上的该数组中添加了一个用户。

然后我应该监听disconnect 事件以了解何时从该数组中删除用户吗?我可以保证该事件只会被触发一次吗?

这有点令人困惑,因为在客户端,有 connect 事件,显然可以多次触发 - 文档说

// note: you should register event handlers outside of connect,
// so they are not registered again on reconnection

这是与服务器端不同的范例,所有处理程序都注册在内部connection 处理程序。但是如果客户端connect 事件可以在重新连接时触发,那么reconnect 事件是干什么用的? (文档说这个事件是“在成功重新连接时触发的。”)

总的来说,我对连接、断开和重新连接的过程以及这与事件的关系感到困惑,它是由于连接问题而“随机”发生还是仅在程序员的控制下发生,以及应该发生多少次预计会收到这些事件中的每一个 - 一次仅用于服务器,多次用于客户端?

感谢您的帮助!

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

    我是 Socket.io 的新手,在理解 连接和断开过程。

    欢迎来到 Node.js + Socket.io 的奇妙世界,超级强大!

    据我了解,服务器会收到一次连接事件 客户端连接,并且为该客户端注册所有处理程序 在 on.('connection') 上的回调中。这是真的吗?

    正确。看看我的代码示例:

    服务器端

    var clients = []; /* stores all sockets on the fly */
    
    io.on('connection', function (socket) {
      clients[socket.id] = socket; /* keeps an array of sockets currently connected */
    
      socket.on('disconnect', function (data) {
          console.log(socket.id + " disconnected");
          delete clients[socket.id];
      });
    
    });
    

    客户端

    socket = io.connect(YOUR_SOCKET_URI, { transports: ['websocket'] } );
    socket_delegates();
    socket_delegates = function() {
        // Socket events
        socket.on('connect', function(data) {
          /* handle on connect events */
        });
        socket.on('disconnect', function () {
          /* handle disconnect events - possibly reconnect? */
        });
        socket.on('reconnect', function () {
          /* handle reconnect events */
        });
        socket.on('reconnect_error', function () {
          /* handle reconnect error events - possible retry? */
        });
    }
    

    然后我是否应该监听断开事件以知道何时删除 该数组中的用户?我能保证那个事件只会 解雇一次?

    是的。你会在上面的服务器代码中看到我们监听disconnect,然后做我们需要做的事情。

    没有什么是随机的。您应该有代码来处理服务器端的connectdisconnect,以及处理客户端的connectdisconnectreconnect 的代码。

    【讨论】:

    • 谢谢。我仍然不清楚的是,客户端似乎可以多次接收“连接”和“断开连接”事件,但服务器只能接收一次。也就是说,例如,服务器是否会在每次客户端收到“断开连接”事件时收到?如果它们不同,那是为什么呢?
    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2012-06-23
    • 2013-10-10
    相关资源
    最近更新 更多