如何在socket.io中清洁地断开命名空间?

3

我一直在尝试断开与命名空间甚至主套接字连接的联系,但一直失败。以下是我的代码:

服务器端:

 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 命名空间。

5个回答

2

这对我有效

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();
        }
    }
};

1

对于 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;

这对我起作用了。

1
在服务器上
nsp.on('connection', (socket) => {
   setTimeout(() => {
      socket.disconnect(false)
   }, 5000);
});

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


0

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

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

0

看起来你没有告诉客户端在重新连接之前等待断开连接。

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

抱歉回复晚了。但是即使按照您的建议操作,我仍然遇到了相同的问题 :( - Bitsian
有没有办法检查套接字是否已断开连接? - Bitsian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接