Socket.io-client: Conectar -> Desconectar -> Conectar não funciona

Criado em 23 jul. 2011  ·  33Comentários  ·  Fonte: socketio/socket.io-client

O código a seguir não funciona para mim:
socket = io.connect ('http://host.com:8081'); socket.disconnect (); socket = io.connect ('http://host.com:8081');

Esta é uma solução alternativa que encontrei:
socket = io.connect ('http://host.com:8081'); socket.disconnect (); excluir io.sockets [' http://host.com : 8081']; io.j = []; socket = io.connect ('http://host.com:8081');

Unable to reproduce bug

Comentários muito úteis

Use este: io.connect(null,{'force new connection':true});

Todos 33 comentários

O mesmo problema aqui - não foi possível conectar-desconectar-reconectar da maneira que você descreveu.

No entanto, descobri que o seguinte funciona. Estranhamente, se você omitir setTimeout e reconectar imediatamente (ou após um tempo limite muito curto), você será desconectado imediatamente.

var ns = io.connect(
        '/',
        { reconnect: false }
    ),
    numDisconnects = 2;

ns.on('connect', function () {

    console.log('Connected');

    if (numDisconnects > 0) {
        console.log('Disconnecting');
        ns.socket.disconnect();

        setTimeout(function () {
            console.log('Reconnecting');
            ns.socket.connect();
        }, 5000);
    }
    numDisconnects--;


});

ns.on('disconnect', function () {
    console.log('Disconnected');
});

socket = io.connect (host);
socket.disconnect ();
socket.socket.reconnect (); || socket.socket.connect (host);
funciona, mas como a reconexão ou a segunda conexão, a desconexão é disparada a cada dois segundos

Eu tive o mesmo problema, então não pude terminar minha entrada de eliminação de nó a tempo devido a este bug :(
Por favor, corrija antes de qualquer outro coração partido!

Nenhuma das soluções alternativas acima funcionou para mim. Caras, isso é um sério obstáculo. Por que a tag "Não foi possível reproduzir"? Meu env de teste. é o Chrome mais recente no OS X 10.6.

Estou vendo a mesma coisa. Também chamar io.connect() uma segunda vez falha sem um erro. Alguém encontrou uma solução alternativa?

Use este: io.connect(null,{'force new connection':true});

Que conveniente e feio. Que tal remover io.sockets[uuri] = socket; de io.js:196 ? Qual é o ponto dessa piada?

Infelizmente, mesmo problema aqui. Você não pode reconectar após a desconexão.

A única coisa que funcionou para mim após a desconexão:
io.j = [];
io.sockets = [];

Edit: não é apenas um problema de desconexão do lado do cliente (). Ele não limpa as estruturas de dados na desconexão - você pode ver que SocketNamespace. $ Events ainda tem todos os retornos de chamada para conexões fechadas, etc.

@MrJoes Use io.connect(null,{'force new connection':true});

Certo, esta é realmente a API final para reconexão? Um pouco estranho.

@skrat eu concordo com você. deve haver uma API io.reconnect .

Acho que não, io.connect então io.disconnect então io.connect deve funcionar, como esperado.

@milani : e vazamento de memória devido a sockets órfãos, manipuladores de eventos, etc., que permanecem em io.sockets []?

Não é uma ideia muito boa para ser honesto.

@MrJoes Tem certeza sobre vazamento de memória? @ 3rd-Eden de io.socket me disse para usar esta API.

Esqueça, não adicionará socket a io.sockets [] se você passar 'forçar nova conexão'.

Porém, é um pouco feio, especialmente com terminais, porque você está perdendo a multiplexação - ele depende do soquete em io.sockets para fazer a multiplexação.

A sugestão de
socket.socket.reconnect ()
Obrigado

O mesmo problema aqui - socket.reconnect () não está funcionando para mim, vou tentar algumas outras soluções alternativas. No entanto, isso é decepcionante, pois é uma funcionalidade bem básica para quebrar em uma atualização. Tenho certeza de que muitos aplicativos não podem ser atualizados facilmente por causa disso.

Se os desenvolvedores precisarem de ajuda para reproduzir o problema, fico feliz em ajudar - estou surpreso ao ver a tag "não foi possível reproduzir" neste bug.

Parece que haverá uma grande atualização em breve por causa desta solicitação pull: https://github.com/LearnBoost/socket.io-client/pull/343
@cacois Tente usar socket.socket.reconnect () em vez de socket.reconnect ()

ah, ótimas notícias :-)

@ wackfordjf3 Ei, obrigado, boa chamada. Funciona agora. :)

Ainda enfrentando problemas para reconectar.
A segunda reconexão faz com que vários eventos de reconexão sejam disparados no servidor. (e isso se multiplica a cada reconexão subsequente). Am firing reconecta em um namespace.

socket = io.connect (url {'reconnect': false}); socket.disconnect; // 1ª desconexão
socket.socket.reconnect (); socket.disconnect (); // 2ª desconexão
socket.socket.reconnect (); // 2ª reconexão

Estou ligado: soquete. [email protected]

Além disso:
Maneira feia funciona bem:
exclua io.sockets [url]; io.j = [];
socket = io.connect (url);

Enfrente a mesma coisa que as pessoas já enfrentaram aqui; até mesmo estranho no cenário de namespace. Abandone a solução para namespacing:

var base = ' http: // localhost : 3000'
, canal = '/ chat'
, url = base + canal;

var socket = io.connect (url);

// chamar socket.disconnect () não desconecta, então:
io.sockets [base] .disconnect ();

// reconectar sintaxe.
delete io.sockets [base]; io.j = [];
socket = io.connect (url);

nota: versão socket.io - 0.9.0, plataforma: windows 7 home premium

Passei uma tarde lutando com testes de unidade que estavam expirando porque não consegui me conectar depois de desconectar. {'forçar nova conexão': true} resolveu o problema. obrigado @milani

O mesmo problema aqui usando Cucumber.js. Como tenho que criar e destruir objetos, estava enfrentando o mesmo conectar, desconectar, conectar falhou. Thx @milani e @rawberg

Funciona para mim! Obrigado @mrjoes.

Obrigado @milani

A configuração 'forçar nova conexão' agora é chamada de 'forceNew' na versão v1.0 para aqueles que podem ter enfrentado esse problema novamente.

Eu empurrei um commit para adicionar BC com isso, então em breve ninguém deverá ter mais esse problema!

funcionou 4 me, socket = io.connect (socketUrl, {'forceNew': true});

forceNew desativa todo o sistema de multiplexação de namespace. Essa é realmente a solução?

Estou a usar:
socket = io.connect ()
...
// ESTA
socket.io.reconnect ()
..

Client.prototype.connect = function() {
    if (!this.connection) {
        this.connection = this.socket.connect(config.host + ':' + config.port);
    }
    else {
        if (!this.connection.connected) {
            this.connection.connect();
        }
    }
};

io.connect (null, {'forçar nova conexão': true});

isso resolve meu problema, obrigado mr. milame

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