【问题标题】:How to cleanly disconnect from a namespace in socket.io?如何彻底断开与 socket.io 中的命名空间的连接?
【发布时间】:2020-04-17 06:13:03
【问题描述】:

我一直试图断开与命名空间甚至主套接字连接本身的连接,但一直失败。下面是我的代码

服务器端:

 socket.on('userDisconnect', function () {        
    socket.disconnect();
    console.log("User Disconnected");       

}); 

客户端:

// already connected to /world namespace
socket.emit('userDisconnect');
    socket.disconnect();
socket = io.connect('http://something/india' );

我尝试断开与客户端和服务端的连接,但它不起作用。谁能指出错误。 这是socket.io写入控制台的内容

   info  - booting client
 debug - websocket writing 0::/world
User Disconnected
   debug - client authorized for /india
   debug - websocket writing 1::/india

/world 是它尝试断开连接然后尝试连接到 /india 名称空间的名称空间。

【问题讨论】:

    标签: node.js sockets azure websocket socket.io


    【解决方案1】:

    这对我有用

    broadcastSocket.packet({ type: 'disconnect' });
        broadcastSocket.$emit('disconnect');
        disconnectNamespace(broadcastSocket.name, broadcastSocket.socket);        
    
    
    function disconnectNamespace (name,socket) {
        if (socket.namespaces[name]) {
            var nsp = socket.of(name);
            nsp.packet({ type: 'disconnect' });
            nsp.$emit('disconnect');
            delete socket.namespaces[name];
    
            if (Object.keys(socket.namespaces).length === 0) {
                socket.disconnect();
            }
        }
    };
    

    【讨论】:

      【解决方案2】:

      对于 socket.io v.1.3.2

      创建:

      sio = io('ws://localhost:13000/device');
      

      删除:

      sio.disconnect();
      delete sio.io.nsps[sio.nsp]; // sio.nsp = '/device'
      delete sio;
      

      这对我有用。

      【讨论】:

        【解决方案3】:

        在服务器上

        nsp.on('connection', (socket) => {
           setTimeout(() => {
              socket.disconnect(false)
           }, 5000);
        });
        

        断开此客户端。如果 close 的值为 true,则关闭底层连接。否则,它只会断开命名空间。它在文档https://socket.io/docs/server-api/

        【讨论】:

          【解决方案4】:

          您似乎没有告诉客户端在重新连接之前等待断开连接。

          // already connected to /world namespace
          socket.emit('userDisconnect');
          socket.on('disconnect', function () {
            socket = io.connect('http://something/india');
            // stuff with india socket
          });
          

          【讨论】:

          • 抱歉回复晚了。但即使按照你的建议,我也遇到了同样的问题:(
          • 有没有办法检查socket是否断开?
          【解决方案5】:

          在服务器或客户端上使用 disconnect() 方法(或两者都像您在示例中所做的那样)。首次连接服务器时,在客户端连接方法中添加 'forceNew':false,如下所示:

          var socket = io('http://localhost:3001', {'forceNew':false});
          

          【讨论】:

            猜你喜欢
            • 2015-10-08
            • 1970-01-01
            • 2017-03-21
            • 1970-01-01
            • 2015-05-18
            • 2012-11-30
            • 1970-01-01
            • 1970-01-01
            • 2013-11-29
            相关资源
            最近更新 更多