强制客户端与socket.io和nodejs断开连接

Dan*_*ney 111 socket.io

有没有办法断开客户端与SocketIO,并确实关闭连接?因此,如果有人连接到我的服务器,并且我想关闭它们与我的服务器之间的连接,我将如何进行此操作?

nh2*_*nh2 135

编辑:现在可以了

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

我的原始答案:

这还不可能.

如果您也需要,请对此问题进行投票/评论.


小智 16

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

Client.emit('disconnect')触发服务器上的断开事件,但不能有效断开客户端.客户端不知道断开连接.

所以问题仍然存在:如何强制客户端断开与服务器端的连接?

  • 由于最近的更新,您的amswer现在不正确,因此-1. (5认同)
  • 使用最新的 socket.io 版本,您不必再手动调用 `Client.emit('disconnect')` ,现在有一个服务器端 `socket.disconnect()` (请参阅我的答案)。 (2认同)

小智 8

您无法让服务器向客户端发出消息使其调用断开连接功能的任何原因?

在客户端:

socket.emit('forceDisconnect');
Run Code Online (Sandbox Code Playgroud)

在服务器上:

socket.on('forceDisconnect', function(){
    socket.disconnect();
});
Run Code Online (Sandbox Code Playgroud)

  • 因为永远不能依赖客户端代码来完全按照您的需要运行.用户可以轻松修改它. (7认同)

Sas*_*ich 5

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

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

  • 如何找到服务器上已断开连接的用户的套接字? (2认同)

Bar*_*mre 5

这对我不起作用

`socket.disconnect()` 
Run Code Online (Sandbox Code Playgroud)

这对我有用

socket.disconnect(true)
Run Code Online (Sandbox Code Playgroud)

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


示例用例:客户端使用无效的访问令牌连接到 Web 套接字服务器(访问令牌通过连接参数移交给 Web 套接字服务器)。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');
// });
Run Code Online (Sandbox Code Playgroud)