2012-05-03 18 views
28

Wie wieder an den Socket io disconnect wurde aufgerufen?Socket IO erneut verbinden?

Hier ist der Code

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; 
    } 
} 

Wenn ich initSocket(true) tun, es funktioniert. Wenn ich initSocket(false) mache, wird die Verbindung getrennt. ABER DANN, wenn ich versuche, mit initSocket(true) wiederherzustellen, funktioniert die Verbindung nicht mehr. Wie kann ich die Verbindung zur Arbeit bekommen?

+0

Es ist in der Bibliothek integriert. Siehe http://StackOverflow.com/a/5149185/17803 – Matt

+0

mögliches Duplikat von [Node.js und Socket.IO - Wie Sie die Verbindung wiederherstellen, sobald die Verbindung getrennt wird] (http://stackoverflow.com/questions/4432271/node -js-and-socket-io-How-to-wiederverbinden-so-bald-wie-Trennen-passiert- – Matt

+5

Ich möchte nicht, dass es bei Verbindung wieder verbinden! Ich möchte in der Lage zu steuern, wann zu verbinden und zu trennen. – Eric

Antwort

39

Nun, haben Sie die Möglichkeit, hier ...

Das erste Mal, wenn Sie die Socket-Wert initialisieren Sie mit io.connect,

das nächste Mal (nachdem Sie einmal aufgerufen haben trennen) verbinden, sollten Sie sollte wieder mit socket.socket.connect() verbinden.

So Ihre initSocket, sollte so etwas wie

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

seine Ich weiß, dass Sie schon eine Antwort haben, aber ich kam hier, weil die socket.IO Client Wiederverbindung in Knoten zur Zeit unterbrochen wird.

Aktive Bugs im Github-Repo zeigen, dass viele Leute keine Ereignisse bei Verbindungsfehlern erhalten und die Verbindung nicht automatisch hergestellt wird.

Um dies zu umgehen, können Sie eine manuelle Reconnect Schleife erstellen können wie folgt:

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

Sie durch folgende Client-Seite Konfiguration anschließen können.

// 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

Ich glaube nicht, dass 'forceNew' bedeutet, dass man sich wieder verbindet.Ich glaube, es bedeutet, jedes Mal, wenn diese Anweisung aufgerufen wird, einen neuen Socket zu erstellen, da 'io.connect()' normalerweise denselben Socket zurückgibt, wenn Sie ihn ein zweites Mal aufrufen. –

0

Ich hatte ein Problem mit socket-io wiederverbinden. Möge dieser Fall jemandem helfen. Ich hatte Code wie folgt:

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

Dies ist falsch, becase gibt es eine Verzögerung zwischen offenen Port Callbacks zugewiesen. Einige Nachrichten können verloren gehen, bevor die DB initialisiert wird. Der richtige Weg, um es zu beheben ist:

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