使用 socket.io 和 nodejs 强制客户端断开与服务器的连接

有没有办法断开客户端与 SocketIO 的连接,并逐字地关闭连接?因此,如果有人连接到我的服务器,我想关闭他们和我的服务器之间的连接,我该怎么做呢?

176685 次浏览

假设您的套接字是命名套接字,使用:

socket.disconnect()

Io 使用 EventEmitter 模式断开/连接/检查心跳,这样您就可以执行

socket.disconnect()只能在客户端使用,而不能在服务器端使用。

Client.emit('disconnect')触发服务器上的断开连接事件,但不能有效地断开客户端的连接。客户端没有意识到断开连接。

因此,问题仍然存在: 如何强制客户端从服务器端断开连接?

client._onDisconnect()应该能用

编辑: 现在这是可能的

您现在可以简单地在服务器端 调用 socket.disconnect()

我最初的回答是:

这还不可能。

如果你也需要它,在 这个问题上投票/评论。

为什么不能让服务器向客户机发送一条消息,让它调用断开连接函数?

客户:

socket.emit('forceDisconnect');

服务器端:

socket.on('forceDisconnect', function(){
socket.disconnect();
});

对于那些在谷歌上找到这个的人来说,现在有一个解决方案:

Socket.disconnect()踢客户端(服务器端)。客户端没有机会保持连接:)

我使用 client.emit('disconnect') + client.removeAllListeners()连接客户端忽略所有事件后断开连接

在我的情况下,我想拆除底层连接,在这种情况下,我必须调用 socket.disconnect(true),因为您可以看到需要从 来源在这里

我在客户端使用 socket.disconnect();

client.emit('disconnect') didnt work for me

向数组中添加新的套接字连接,然后在希望通过它们关闭所有循环并断开连接时再添加新的套接字连接。(伺服器端)

var socketlist = [];


io.sockets.on('connection', function (socket) {
socketlist.push(socket);
//...other code for connection here..
});




//close remote sockets
socketlist.forEach(function(socket) {
socket.disconnect();
});

这个 没用对我来说:

`socket.disconnect()`

这个 起作用了对我来说:

socket.disconnect(true)

移交 true将关闭到客户端的底层连接,而不仅仅是连接到 Socket IO 文档的客户端名称空间。


一个示例用例: 客户端使用无效的访问令牌连接到 web socket 服务器(使用连接参数将访问令牌移交给 web socket 服务器)。Web 套接字服务器通知客户端将要关闭连接,因为他的访问令牌无效:

// (1) the server code emits
socket.emit('invalidAccessToken', function(data) {
console.log(data);       // (4) server receives 'invalidAccessTokenEmitReceived' from client
socket.disconnect(true); // (5) force disconnect client
});


// (2) the client code listens to event
// client.on('invalidAccessToken', (name, fn) => {
//     // (3) the client ack emits to server
//     fn('invalidAccessTokenEmitReceived');
// });

用途:

套接字。断开()//ok

不要使用:

Disconnect ()

今天早上查了一下,现在似乎是:

socket.close()

Https://socket.io/docs/client-api/#socket-close

你可以做 socket = undefined在擦除哪个套接字你已经连接。所以当要连接做套接字(网址)

看起来就像这样

const socketClient = require('socket.io-client');


let socket;


// Connect to server
socket = socketClient(url)


// When want to disconnect
socket = undefined;

我使用的套接字客户端上的反应本机应用程序,当我调用 socketIOClient.disconnect()这断开从服务器,但当我连接到套接字再次连接以前的事件,下面的代码为我工作,删除所有现有的事件和断开套接字连接。

socketIOClient.removeAllListeners();
socketIOClient.disconnect(true);

从服务器端强制断开套接字

socket.disconnect(true)

或者

通过客户端事件断开套接字

客户:

socket.emit('forceDisconnect');

服务器端:

socket.on('forceDisconnect', function(){
socket.disconnect(true);
});

您可以在客户机和服务器上调用 socket.disconnect()