2012-05-03 2 views
28

Come riconnettersi al socket io una volta è stato chiamato disconnect?Riconnessione IO socket?

Ecco il codice

function initSocket(__bool){      
    if(__bool == true){    
     socket = io.connect('http://xxx.xxx.xxx.xxx:8081', {secure:false});  
     socket.on('connect', function(){console.log('connected')});         
     socket.on('disconnect', function(){console.log('disconnected')}); 
    }else{ 
     socket.disconnect(); 
     socket = null; 
    } 
} 

Se lo faccio initSocket(true), funziona. Se faccio initSocket(false), si disconnette. MA POI se provo a riconnetterti usando initSocket(true), la connessione non funziona più. Come posso far funzionare la connessione?

+0

È incorporato nella libreria. Vedi http://stackoverflow.com/a/5149185/17803 – Matt

+0

possibile duplicato di [Node.js e Socket.IO - Come riconnettersi non appena si verifica la disconnessione] (http://stackoverflow.com/questions/4432271/node -js-and-socket-io-how-to-reconnect-as-soon-as-disconnect-happens) – Matt

+5

Non voglio che si ricolleghi alla disconnessione! Voglio essere in grado di controllare quando connetterti e disconnetterti .. – Eric

risposta

39

Beh, avete un'opzione qui ...

La prima volta che si inizializza il valore presa si dovrebbe collegarsi con io.connect,

La prossima volta (dopo aver chiamato scollegare una sola volta), è dovrebbe riconnettersi con socket.socket.connect().

Così il vostro initSocket, dovrebbe essere qualcosa di simile a

function initSocket(__bool){      
    if(__bool){   
     if (!socket) { 
      socket = io.connect('http://xxx.xxx.xxx.xxx:8081', {secure:false});  
      socket.on('connect', function(){console.log('connected')});         
      socket.on('disconnect', function(){console.log('disconnected')}); 
     } else { 
      socket.socket.connect(); // Yep, socket.socket (2 times) 
     } 
    }else{ 
     socket.disconnect(); 
     // socket = null; <<< We don't need this anymore 
    } 
} 
12

So che avete già una risposta, ma sono arrivato qui perché la funzionalità di client di riconnessione socket.IO è rotto nel nodo al momento.

Bug attivi sul repository github mostrano che molte persone non ricevono eventi in caso di problemi di connessione e la riconnessione non avviene automaticamente.

Per risolvere questo problema, è possibile creare un ciclo riconnessione manuale come segue:

var socketClient = socketioClient.connect(socketHost) 

var tryReconnect = function(){ 

    if (socketClient.socket.connected === false && 
     socketClient.socket.connecting === false) { 
     // use a connect() or reconnect() here if you want 
     socketClient.socket.connect() 
    } 
} 

var intervalID = setInterval(tryReconnect, 2000) 

socketClient.on('connect', function() { 
    // once client connects, clear the reconnection interval function 
    clearInterval(intervalID) 
    //... do other stuff 
}) 
5

È possibile riconnettersi seguendo lato client config.

// 0.9 socket.io version 
io.connect(SERVER_IP,{'force new connection':true }); 

// 1.0 socket.io version 
io.connect(SERVER_IP,{'forceNew':true }); 
+2

Non credo che "forceNew" significhi riconnettersi.Credo che significhi creare un nuovo socket ogni volta che viene chiamata questa istruzione perché normalmente 'io.connect()' restituirà lo stesso socket se lo si richiama una seconda volta. –

0

Ho riscontrato un problema con la riconnessione di socket-io. Potrebbe essere questo caso aiuterà qualcuno. Ho avuto il codice come questo:

var io = require('socket.io').listen(8080); 
DB.connect(function() { 
    io.sockets.on('connection', function (socket) { 
     initSockets(socket); 
    }); 
}); 

questo è errato, perché è presente un ritardo tra le chiamate aperte a porta aperta. Alcuni messaggi potrebbero andare persi prima che DB venga inizializzato. Il modo giusto per risolverlo è:

var io = null; 
DB.connect(function() { 
    io = require('socket.io').listen(8080); 
    io.sockets.on('connection', function (socket) { 
     console.log("On connection"); 
     initSockets(socket); 
    }); 
});