Socket.io: Client.disconnect()を使用して、クライアントを強制的に切断します

作成日 2010年09月08日  ·  24コメント  ·  ソース: socketio/socket.io

クライアントインスタンスにdisconnect()メソッドがあると便利です。 これは、IRCのキック/禁止などのメカニズムを実装するのに役立ちます。 基本的に、虐待者を取り除く方法が必要です。

最も参考になるコメント

socket.disconnect();は正しく機能していないようです。確かに切断イベントがトリガーされますが、文字通り接続が閉じられません。 バグがありますか、またはこの動作が予想されますか?

全てのコメント24件

実装する価値があるかどうかを議論するのは興味深いかもしれません(ただし、優先度は低くなります)。 ただし、IRCキック/バンは、そのような機能を使用しない例です。 これらのシナリオでは、クライアントの接続を維持し、特定のチャネルのメッセージのブロードキャストを防止することが望まれます。

同様の方法を考えたときにこれを見つけました。

トランスポートの理由ではなく、ポリシーの理由で切断されていることをクライアントに明示的かつ明確に伝える方法が必要です。 たとえば、認証の失敗。 このようにして、クライアントは接続が確立されたことを認識しますが、ホストの要求で切断されたため、フォールバックトランスポートを試す必要はありません。

ありがとう!

これは確かに非常に便利です。

client.connection.destroy()は、クライアントを切断するための正当な方法ですか?

plus1。 クライアントをきれいに切断する方法が欲しいです。 :)

client._onDisconnect(); また
socket.clients [kickedUserSocketId] ._ onDisconnect();

トリックをしているようです。

注:「onDisconnect」の前にアンダースコアがあり、このマークダウンでは表示されません。

また、誰かがこのようにそれを行うのを見ました(しかしそれを自分でテストしていません):
socket.clients [kickedClientId] .send({event: 'disconnect'});
socket.clients [kickedClientId] .connection.end();

これは今実装されていますか、それとも-メソッドを使用する必要がありますか

socket.clients [kickedClientId] .send({event: 'disconnect'});
socket.clients [kickedClientId] .connection.end();

これを行うための「公式」の方法は何ですか????

公式の方法がわかるように、もう一度開いてください。

これに対する解決策はまだありません。進行状況を追跡するために再度開いてください。

client /socket.jsでこのコードを発見しました。

/**
 * Kicks client
 *
 * <strong i="6">@api</strong> public
 */

Socket.prototype.disconnect = function () {
  if (!this.disconnected) {
    this.log.info('booting client');

    if ('' === this.namespace.name) {
      if (this.manager.transports[this.id] && this.manager.transports[this.id].open) {
        this.manager.transports[this.id].onForcedDisconnect();
      } else {
        this.manager.onClientDisconnect(this.id);
        this.manager.store.publish('disconnect:' + this.id);
      }
    } else {
      this.packet({type: 'disconnect'});
      this.manager.onLeave(this.id, this.namespace.name);
      this.$emit('disconnect', 'booted');
    }

  }

  return this;
};

私はそれを試しました( socket.disconnect() )、そしてそれはうまくいきます。 このコードは2011年半ばから存在しているようで、誰も教えてくれませんでした。

問題#795も参照してください。

socket.disconnect();は正しく機能していないようです。確かに切断イベントがトリガーされますが、文字通り接続が閉じられません。 バグがありますか、またはこの動作が予想されますか?

@geniousphp私は同じ問題を抱えています

では、なぜ問題は解決されたのでしょうか。 もしそうなら、どのように? 結論は何ですか?

なぜ閉じているのかわかりませんが、機能しません。それでも、醜い方法で強制的に切断します。

試す、
socket.manager.onClientDisconnect(socket.id);

それが私が欲しいものだと思います。 驚くばかり。

残念ながら、 @ acidhaxのメソッドは、1.0リリース以降は機能しなくなりました。

とにかく、0.9.16を1.XXにスムーズにアップグレードすることはありますか?

+1

ここに同じボート。 テストを相互に分離したいので、これはテストにとって非常に重要です。

    try {
        IO.Options opts = new IO.Options();
        opts.forceNew = true;
        opts.timeout = -1;
        socket1 = IO.socket(c.ip, opts);
        socket1.on("res", getdataListener);
        socket1.connect();
                socket1.on(com.github.nkzawa.socketio.client.Socket.EVENT_CONNECT,
                new Emitter.Listener() {

                    <strong i="5">@Override</strong>
                    public void call(Object... args) {

                        Logger.print("CONNECTED...............");

                        Message msg = new Message();
                        msg.what = ResponseCodes.CreateQueueResp;
                        Login.handler.sendMessage(msg);

                        activity.runOnUiThread(new Runnable() {

                            <strong i="6">@Override</strong>
                            public void run() {
                                // TODO Auto-generated method stub

                                startChecking();
                                startIdleChecking();

                            }

                        }); 
                    }

                })
                .on(com.github.nkzawa.socketio.client.Socket.EVENT_RECONNECT,
                        new Emitter.Listener() {

                            <strong i="7">@Override</strong>
                            public void call(Object... arg0) {


                                System.out
                                        .println("............... EVENT_RECONNECT");

                                // TODO Auto-generated method stub

                            }
                        })
                .on(com.github.nkzawa.socketio.client.Socket.EVENT_CONNECT_ERROR,
                        new Emitter.Listener() {

                            <strong i="8">@Override</strong>
                            public void call(Object... args) {

                                System.out
                                        .println("............... EVENT_CONNECT_ERROR");

                            }

                        })
                .on(com.github.nkzawa.socketio.client.Socket.EVENT_CONNECT_TIMEOUT,
                        new Emitter.Listener() {

                            <strong i="9">@Override</strong>
                            public void call(Object... args) {

                                System.out
                                        .println("............... EVENT_CONNECT_TIMEOUT");

                            }

                            // this is the emit from the server
                        })

                .on(Socket.EVENT_ERROR, new Emitter.Listener() {

                    <strong i="10">@Override</strong>
                    public void call(Object... args) {

                        System.out
                                .println("......................... EVENT_ERROR");

                    }

                    // this is the emit from the server

                })
                .on(com.github.nkzawa.socketio.client.Socket.EVENT_DISCONNECT,
                        new Emitter.Listener() {

                            <strong i="11">@Override</strong>
                            public void call(Object... args) {

                                Logger.print(".............EVENT_DISCONNECT");


                                if (!open) {

                                    //server_message = getResources().getString(R.string.It_seems_that);


                                    server_message="It seems that connection to server have been Lost.Please reconnect!"; 

                                    ServerError error = new ServerError(activity, server_message);


                                }

                            }

                        });

    } catch (Exception e) {

        e.printStackTrace();

    }

デバイスがメッセージを受信すると、関数アプリが繰り返しトリガーされました。 関数アプリのソケット接続が開くたびに開いた接続を強制的に閉じる方法
これが私の論理です:
'厳密に使用';
var _test = require( 'socket.io-client');
var socket = _test.connect( 'http://XXXXXXXXXX.net/');
exports.handler = function(event、context){
var ResultMessage = JSON.stringify(event.message、null、2);
if(!socket.connected)
{{
socket.emit( 'ユーザーの追加'、 '1542');
}
socket.emit( '新しいメッセージ'、 "[" + ResultMessage + "]");

};
ありがとう、
あらかじめ。

このページは役に立ちましたか?
0 / 5 - 0 評価