Socket.io: Client.disconnect() pour forcer un client à se déconnecter

Créé le 8 sept. 2010  ·  24Commentaires  ·  Source: socketio/socket.io

Ce serait formidable d'avoir une méthode disconnect() sur les instances Client. Ceci est utile pour implémenter des mécanismes tels que le kick/ban d'IRC. Fondamentalement, il doit y avoir un moyen de se débarrasser des agresseurs.

Commentaire le plus utile

le socket.disconnect(); ne semble pas fonctionner correctement, il déclenche certainement l'événement de déconnexion, mais il ne ferme pas littéralement la connexion. Y a-t-il un bug ou ce comportement est-il attendu ?

Tous les 24 commentaires

Il pourrait être intéressant de discuter si cela vaut la peine d'être mis en œuvre (bien que ce soit une faible priorité). Cependant, IRC kick/ban est un exemple où je n'utiliserais pas une telle fonctionnalité. Dans ces scénarios, il est souhaitable de garder le client connecté et d'empêcher simplement la diffusion des messages d'un canal spécifique.

J'ai trouvé cela en réfléchissant à une méthode similaire.

J'aimerais un moyen d'indiquer explicitement et proprement à un client qu'il est déconnecté pour des raisons de politique, et non pour des raisons de transport. Par exemple, un échec d'autorisation. De cette façon, le client sait que la connexion a été établie mais a été déconnectée à la demande de l'hôte et n'a pas besoin d'essayer les transports de secours.

Merci!

Ce serait effectivement très utile.

client.connection.destroy() est-il un moyen légitime de déconnecter un client ?

plus1. J'adorerais avoir un moyen de déconnecter proprement un client. :)

client._onDisconnect(); ou
socket.clients[kickedUserSocketId]._onDisconnect();

semblent faire l'affaire.

REMARQUE : il y a un trait de soulignement avant le "onDisconnect", il ne s'affiche tout simplement pas dans cette démarque.

J'ai aussi vu quelqu'un le faire comme ça (je ne l'ai pas testé moi-même cependant):
socket.clients[kickedClientId].send({ event: 'déconnecter' });
socket.clients[kickedClientId].connection.end();

Est-ce implémenté maintenant, ou devrais-je utiliser la méthode -

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

Quelle est la manière "officielle" de le faire ????

Veuillez rouvrir afin que nous sachions quelle est la voie officielle.

Il n'y a toujours pas de solution à ce problème, veuillez rouvrir pour suivre les progrès.

Je viens de découvrir ce code dans 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;
};

Je l'ai essayé ( socket.disconnect() ) et ça marche bien. Il semble que ce code existe depuis la mi-2011 et personne ne nous l'a dit.

Voir aussi le numéro 795.

le socket.disconnect(); ne semble pas fonctionner correctement, il déclenche certainement l'événement de déconnexion, mais il ne ferme pas littéralement la connexion. Y a-t-il un bug ou ce comportement est-il attendu ?

@geniousphp j'ai le même problème

Alors pourquoi le problème est-il clos, est-il résolu ? si c'est le cas, comment? Quelle est la conclusion?

Je ne sais pas pourquoi c'est fermé, ça ne marche pas pour moi et j'utilise toujours la vilaine façon de forcer la déconnexion.

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

Je pense que c'est ce que je veux. impressionnant.

Malheureusement @acidhax sa méthode ne marche plus depuis la version 1.0

Existe-t-il de toute façon une mise à niveau de 0.9.16 vers 1.XX en douceur, les gars ?

+1

Même bateau ici. Ceci est très important pour les tests car vous souhaitez isoler les tests les uns des autres.

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

    }

Mon application de fonction s'est déclenchée à plusieurs reprises lorsque l'appareil reçoit le message. Chaque fois que ma connexion de socket d'application de fonction s'est ouverte. Comment fermer de force la connexion ouverte.
Voici ma logique :
« utiliser strict » ;
var _test = require('socket.io-client');
var socket = _test.connect('http://XXXXXXXXXX.net/');
exports.handler = fonction (événement, contexte) {
var ResultMessage = JSON.stringify(event.message,null,2) ;
si(!socket.connecté)
{
socket.emit('ajouter un utilisateur', '1542');
}
socket.emit('nouveau message',"[" + ResultMessage + "]");

} ;
Merci,
En avance.

Cette page vous a été utile?
0 / 5 - 0 notes