Socket.io: Client.disconnect () para forçar um cliente a se desconectar

Criado em 8 set. 2010  ·  24Comentários  ·  Fonte: socketio/socket.io

Seria ótimo ter um método disconnect () nas instâncias do cliente. Isso é útil para implementar mecanismos como kick / ban do IRC. Basicamente, deve haver uma maneira de se livrar dos agressores.

Comentários muito úteis

o socket.disconnect(); não parece funcionar corretamente, certamente ele dispara o evento de desconexão, mas não fecha literalmente a conexão. Existe um bug ou esse comportamento é esperado?

Todos 24 comentários

Pode ser interessante discutir se vale a pena implementar (embora seja de baixa prioridade). No entanto, IRC kick / ban é um exemplo de onde eu não usaria tal funcionalidade. Nesses cenários, deseja-se manter o cliente conectado, e apenas evitar a transmissão de mensagens de um canal específico.

Achei isso ao ponderar um método semelhante.

Gostaria de uma maneira de informar de forma explícita e clara a um cliente que ele está sendo desconectado por motivos de política, não por motivos de transporte. Por exemplo, falha de autorização. Dessa forma, o cliente sabe que a conexão foi estabelecida, mas foi desconectada por ordem do host e não precisa tentar transportes de fallback.

Obrigado!

Isso seria realmente muito útil.

Client.connection.destroy () é uma maneira legítima de desconectar um cliente?

plus1. Adoraria ter uma maneira de desconectar um cliente de maneira limpa. :)

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

parecem fazer o truque.

NOTA: Há um sublinhado antes de "onDisconnect", ele simplesmente não renderiza nesta marcação.

Também vi alguém fazer assim (embora não tenha testado):
socket.clients [kickedClientId] .send ({evento: 'desconectar'});
socket.clients [kickedClientId] .connection.end ();

Isso está implementado agora ou devo usar o método -

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

Qual é a forma "oficial" de fazer isso ????

Por favor, reabra para que possamos descobrir qual é a forma oficial.

Ainda não há solução para isso, reabra para acompanhar o andamento.

Acabei de descobrir este código em 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;
};

Eu tentei ( socket.disconnect() ) e funciona bem. Parece que esse código existe desde meados de 2011 e ninguém nos informou.

Consulte também a edição nº 795.

o socket.disconnect(); não parece funcionar corretamente, certamente ele dispara o evento de desconexão, mas não fecha literalmente a conexão. Existe um bug ou esse comportamento é esperado?

@geniousphp estou tendo o mesmo problema

Então, por que o problema foi encerrado, ele foi resolvido? se sim como? Qual é a conclusão?

Não sei por que está fechado, não funciona para mim e ainda uso o jeito feio de forçar a desconexão.

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

Acho que é isso que eu quero. incrível.

Infelizmente @acidhax seu método não funciona mais desde o lançamento 1.0

Existe alguma maneira de atualizar o 0.9.16 para o 1.XX sem problemas, pessoal?

+1

O mesmo barco aqui. Isso é muito importante para o teste, pois você deseja isolar os testes uns dos outros.

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

    }

Meu aplicativo de função é acionado repetidamente quando o dispositivo recebe a mensagem. Toda vez que minha conexão de soquete de aplicativo de função é aberta.Como fechar a conexão aberta à força.
Aqui está a minha lógica:
'use estrito';
var _test = require ('socket.io-client');
var socket = _test.connect ('http://XXXXXXXXXX.net/');
exportações.handler = função (evento, contexto) {
var ResultMessage = JSON.stringify (event.message, null, 2);
if (! socket.connected)
{
socket.emit ('adicionar usuário', '1542');
}
socket.emit ('nova mensagem', "[" + ResultMessage + "]");

};
Obrigado,
Antecipadamente.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

darrachequesne picture darrachequesne  ·  51Comentários

shivajivarma picture shivajivarma  ·  37Comentários

fadaytak picture fadaytak  ·  42Comentários

shi-yuan picture shi-yuan  ·  129Comentários

runvnc picture runvnc  ·  73Comentários