2011-08-29 9 views
5

Sto sviluppando un'applicazione in cui i client si connettono a un server nodejs tramite Socket.io e si iscrivono a una varietà di eventi. Queste sottoscrizioni sono abbastanza complesse e non possono essere gestite con la funzione di canale di Socket.IO.Come simulare un errore di connessione in Socket.IO

Ciò significa che il client deve tenere traccia dei propri abbonamenti e potrebbe dover reiscriversi quando è stato disconnesso. Sfortunatamente, non sono abbastanza sicuro di come Socket.IO gestisca la riconnessione e esattamente quanto trasparente ciò accada al client.

Quindi, ecco la domanda: come posso simulare un errore di connessione e forzare Socket.IO a riconnettersi?

+3

Scollegare il cavo Ethernet e collegarlo di nuovo? – xavierm02

+0

O forse basta eliminare la connessione su entrambi i lati senza chiuderla prima per vedere come reagisce l'altro lato. – xavierm02

+0

@ xavierm02: Funzionerebbe, ma in realtà non è il tipo di approccio che vorresti usare nei test unitari :-) E come faccio a "cancellare" la connessione? – n3rd

risposta

-1

Dalla mia esperienza, ho trovato questo per essere la soluzione più semplice e utile:

lato client:

// the next 3 functions will be fired automatically on a disconnect. 
// the disconnect (the first function) is not required, but you know, 
// you can use it make some other good stuff. 

socket.on("disconnect", function() { 
    console.log("Disconnected"); 
}); 

socket.on("reconnect", function() { 
    // do not rejoin from here, since the socket.id token and/or rooms are still 
    // not available. 
    console.log("Reconnecting"); 
}); 

socket.on("connect", function() { 
    // thats the key line, now register to the room you want. 
    // info about the required rooms (if its not as simple as my 
    // example) could easily be reached via a DB connection. It worth it. 
    socket.emit("registerToRoom", $scope.user.phone); 
}); 

lato server:

io.on('connection', function(socket){ 
    socket.on("registerToRoom", function(userPhone) { 
    socket.join(userPhone); 
    }); 
}); 

E questo è tutto. Molto semplice e diretto.

È anche possibile aggiungere nella presa collegata (l'ultima funzione) alcuni aggiornamenti più alla visualizzazione dell'utente, come ad esempio l'aggiornamento dell'indice o qualcos'altro.

Problemi correlati