单个客户端可以激发多少次Socket.io“连接”和“断开连接”事件?

时间:2018-08-26 13:29:34

标签: node.js socket.io

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

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

据我所知,服务器在客户端连接时收到一次disconnect事件,并且在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事件的作用是什么? (文档说此事件是“重新连接成功后触发的。”)

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

感谢您的帮助!

1 个答案:

答案 0 :(得分: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