回答:
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();
});
グーグルでこれを見つけた人のために-これの今の解決策があります:
Socket.disconnect()
クライアント(サーバー側)をキックします。クライアントが接続を維持する機会はありません:)
disconnect
イベントをリッスンして、ソケットが切断されたかどうかを確認します。close
イベントになることもありますが、よくわかりません。詳細については、socket.ioのドキュメントを参照してください。
Socket.ioは、EventEmitterパターンを使用して、ハートビートの切断/接続/チェックを行います。 Client.emit('disconnect');
これは私にとってはうまくいきませんでした:
`socket.disconnect()`
これは私にとってうまくいきました:
socket.disconnect(true)
引き渡すtrue
と、クライアントがソケット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();
});