首页 > 解决方案 > Socket.io 'connection' 和 'disconnection' 事件可以为单个客户端触发多少次?

问题描述

编辑:我看到我在服务器上的处理程序中得到ping timeouttransport error原因。disconnect这使得在我的服务器中维护状态变得困难(我试图跟踪哪些用户在类似聊天的设置中连接(。我正在阅读它可能与 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.jssocket.io

解决方案


我是 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然后执行我们需要的操作。

没有什么是随机的。您应该有代码来处理服务器端的connect,和处理,和客户端的代码。disconnectconnectdisconnectreconnect


推荐阅读