socket.ioおよびnodejsを使用してクライアントをサーバーから強制的に切断する


117

SocketIOでクライアントを切断し、文字通り接続を閉じる方法はありますか?それで、誰かが私のサーバーに接続していて、それらと私のサーバーとの間の接続を閉じたいのであれば、どうすればよいですか?

回答:


145

編集:これが可能になりました

これsocket.disconnect()で、サーバー側で簡単に呼び出すことができます

私の元の答え:

これはまだ不可能です。

必要な場合は、この問題に投票/コメントしてください


だから私はそうしています、そしてそれはクライアントを強制的に切断します、残念ながら、クライアントはただちに再接続するだけのようです。私は何が起こっているのかを誤解していますか、それとも予想される行動ですか?
kybernetikos 2013年

@kybernetikosはい、私はこれを期待します-結局、クライアントは自分で何をするかを選択できます。多くの場合、現在の接続から反対側をキックしたい場合があります。たとえば、認証タイムアウトが原因です-この後の再接続はおそらく望ましいでしょう。
nh2 2013年

それで、クライアントに「離れて、私は本当にそういうことだ」と伝える方法を知っていますか クライアントの動作が悪いと判断し、サーバー上のリソースを使い果たしてほしくないという観点から考えています。
kybernetikos 2013年

@kybernetikosいいえ、それはできません(通常)。ただし、クライアント側をプログラミングしている場合は、必要なロジックを実装できます。たとえば、再接続を停止します。そうでない場合は、ユーザーを繰り返しキックする必要があります。または、本当に必要な場合は、標準のブロックテクニックを使用してください。これらが実装されているレベルが低いほど(たとえばiptables)、より多くのリソースを節約できます。ほとんどの場合、socketioはそれを迅速に接続しないため、クライアントを単にキックするだけで十分です。誰かが本当にあなたにDoSを実行したい場合は、とにかく他の方法があります(たとえば、あなたからページをダウンロードする)。
nh2

1
@ManishSapkalおそらく新しい質問を開く必要があります。コメントにうまく適合しません。
nh2

15

socket.disconnect() クライアント側でのみ使用でき、サーバー側では使用できません。

Client.emit('disconnect')サーバーで切断イベントをトリガーしますが、クライアントを効果的に切断しません。クライアントは切断を認識していません。

したがって、問題は残ります:クライアントをサーバー側から強制的に切断する方法は?


1
Client.emit('disconnect')最近のsocket.ioバージョンでは、手動で呼び出す必要はありませんsocket.disconnect()。サーバー側になりました(私の答えを参照してください)。
nh2

5
最近の更新により、amswerは正しくないため、-1になります。
corazza 2012

これsocket.disconnect()はサーバー側でも使用できるようになったため、この回答は無効になりました。
Vassilis Barzokas

@VassilisBarzokas disconnect()関数の終了後にコールバックが必要で、コールバックにパラメーターを渡す場合はどうなりますか?
newguy 2017年

合意されたメッセージのセットを作成し、一方の当事者が他方の当事者に切断したいことを通知し、次に必要なことを実行してから実際に切断します。
マイク 'Pomax'カマーマンズ

8

サーバーに切断機能を呼び出させるメッセージをクライアントに送信できない理由は何ですか?

クライアント上:

socket.emit('forceDisconnect');

サーバー上:

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

7
なぜなら、クライアント側のコードが期待どおりに機能することに依存することはできないからです。ユーザーは簡単に変更できます。
Kaustubh Karkare 2013年

4

ソケットの名前付きソケットを想定して、以下を使用します。

socket.disconnect()

2
残念ながら、これは機能しません。サーバー側から特定のクライアントへの接続を閉じようとしています。
ダニエルケニー

4

グーグルでこれを見つけた人のために-これの今の解決策があります:

Socket.disconnect()クライアント(サーバー側)をキックします。クライアントが接続を維持する機会はありません:)


サーバーで切断されているユーザーのソケットを見つけるにはどうすればよいですか?
Manish Sapkal、2014

マニッシュ:ソケットのdisconnectイベントをリッスンして、ソケットが切断されたかどうかを確認します。closeイベントになることもありますが、よくわかりません。詳細については、socket.ioのドキュメントを参照してください。
Sascha Gehlich 2014年



2

client._onDisconnect() うまくいくはず


1
これは完全に機能します。..自分のクライアントへのマッピングを維持します..そのマッピングを使用します...簡単にクライアントを切断します。.乾杯
Arenstar


1

これ私にとってはうまくいきませんでした:

`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');
// });

0

接続クライアントにclient.emit('disconnect')+ client.removeAllListeners()を使用して、切断後にすべてのイベントを無視します


0

クライアント側で使用しています socket.disconnect();

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

0

使用する :

socket.Disconnect()// ok

使ってはいけません :

socket.disconnect()


0

socket = undefined接続したソケットを消去することができます。だから接続したいときはsocket(url)

だからこのようになります

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

let socket;

// Connect to server
socket = socketClient(url)

// When want to disconnect
socket = undefined;

-1

新しいソケット接続をアレイに追加し、すべてを閉じたい場合は、それらをループして切断します。(サーバ側)

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();                      
    });    
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.