Socket.io: Client.disconnect() untuk memaksa klien memutuskan sambungan

Dibuat pada 8 Sep 2010  ·  24Komentar  ·  Sumber: socketio/socket.io

Akan sangat bagus untuk memiliki metode disconnect() pada instance Klien. Ini berguna untuk menerapkan mekanisme seperti kick/ban IRC. Pada dasarnya perlu ada cara untuk menyingkirkan pelaku kekerasan.

Komentar yang paling membantu

socket.disconnect(); tampaknya tidak berfungsi dengan benar, tentu saja memicu acara disconnect, tetapi tidak menutup koneksi secara harfiah. Apakah ada bug atau perilaku ini diharapkan?

Semua 24 komentar

Mungkin menarik untuk mendiskusikan apakah itu layak untuk diterapkan (walaupun itu akan menjadi prioritas rendah). Namun, kick/ban IRC adalah contoh di mana saya tidak akan menggunakan fungsi tersebut. Dalam skenario itu diinginkan untuk menjaga klien tetap terhubung, dan hanya mencegah penyiaran pesan dari saluran tertentu.

Menemukan ini ketika merenungkan metode serupa.

Saya ingin cara untuk secara eksplisit dan jelas memberi tahu klien bahwa itu terputus karena alasan kebijakan, bukan alasan transportasi. Misalnya, kegagalan otorisasi. Dengan cara ini, klien mengetahui koneksi telah dibuat tetapi terputus atas perintah host, dan tidak perlu mencoba transport mundur.

Terima kasih!

Ini memang akan sangat berguna.

Apakah client.connection.destroy() cara yang sah untuk memutuskan sambungan klien?

ditambah1. Akan senang memiliki cara untuk memutuskan klien dengan bersih. :)

klien._onDisconnect(); atau
socket.clients[kickedUserSocketId]._onDisconnect();

tampaknya melakukan trik.

CATATAN: Ada garis bawah sebelum "onDisconnect", hanya saja tidak ditampilkan dalam penurunan harga ini.

Juga melihat seseorang melakukannya seperti ini (belum mengujinya sendiri):
socket.clients[kickedClientId].send({ event: 'disconnect' });
socket.clients[kickedClientId].connection.end();

Apakah ini diterapkan sekarang, atau haruskah saya menggunakan metode -?

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

Apa cara "resmi" untuk melakukan ini????

Silakan buka kembali sehingga kami mengetahui apa cara resminya.

Masih belum ada solusi untuk ini, silakan buka kembali untuk melacak kemajuan.

Saya baru saja menemukan kode ini di 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;
};

Saya mencobanya ( socket.disconnect() ) dan berfungsi dengan baik. Sepertinya kode ini sudah ada sejak pertengahan 2011 dan tidak ada yang memberi tahu kami.

Lihat juga edisi #795.

socket.disconnect(); tampaknya tidak berfungsi dengan benar, tentu saja memicu acara disconnect, tetapi tidak menutup koneksi secara harfiah. Apakah ada bug atau perilaku ini diharapkan?

@geniousphp Saya mengalami masalah yang sama

Jadi mengapa masalah ini ditutup, apakah sudah terpecahkan? jika demikian bagaimana? Apa kesimpulannya?

Saya tidak tahu mengapa itu ditutup, itu tidak berhasil untuk saya dan saya masih menggunakan cara yang buruk untuk memaksa pemutusan.

Mencoba,
socket.manager.onClientDisconnect(socket.id);

Saya pikir itulah yang saya inginkan. luar biasa.

Sayangnya @acidhax metodenya tidak berfungsi lagi sejak rilis 1.0

Apakah ada yang upgrade 0.9.16 ke 1.XX dengan lancar, guys?

+1

Perahu yang sama di sini. Ini sangat penting untuk pengujian karena Anda ingin mengisolasi pengujian satu sama lain.

    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();

    }

Aplikasi fungsi saya terpicu berulang kali saat perangkat menerima pesan. Setiap kali koneksi soket aplikasi fungsi saya terbuka. Cara menutup koneksi yang dibuka secara paksa.
Inilah logika saya:
'gunakan ketat';
var _test = membutuhkan('socket.io-client');
var socket = _test.connect('http://XXXXXXXXXX.net/');
export.handler = function (event,context) {
var ResultMessage = JSON.stringify(event.message,null,2);
jika(!soket.terhubung)
{
socket.emit('tambahkan pengguna', '1542');
}
socket.emit('pesan baru',"[" + ResultMessage + "]");

};
Terima kasih,
Terlebih dahulu.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat