Answers:
iptables
),您将节省更多的资源。但是,在大多数情况下,只需踢一下客户端就足够了,因为socketio不能快速连接客户端,并且如果有人真的想对您进行DoS,反正他们还有其他方法(例如,从您下载页面)。
socket.disconnect()
只能在客户端使用,不能在服务器端使用。
Client.emit('disconnect')
触发服务器上的断开连接事件,但不能有效断开客户端连接。客户端不知道断开连接。
因此,问题仍然存在:如何强制客户端从服务器端断开连接?
Client.emit('disconnect')
再使用最新的socket.io版本进行手动调用,现在有了服务器端socket.disconnect()
(请参阅我的回答)。
socket.disconnect()
可以在服务器端使用。
disconnect()
函数完成后将一些参数传递给回调该怎么办?
您为什么不能让服务器向客户端发送一条消息,使其调用断开功能?
在客户端上:
socket.emit('forceDisconnect');
在服务器上:
socket.on('forceDisconnect', function(){
socket.disconnect();
});
对于那些在Google上发现此问题的人-现在有解决方案:
Socket.disconnect()
踢客户端(服务器端)。客户没有机会保持联系:)
disconnect
事件,以了解其是否已断开连接。我也close
不太确定,这也可能是事件。有关此的更多信息,请参见socket.io的文档。
这对我不起作用:
`socket.disconnect()`
这确实为我工作:
socket.disconnect(true)
移交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');
// });
将新的套接字连接添加到阵列,然后在要关闭所有套接字连接时-遍历它们并断开连接。(服务器端)
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();
});