2011-08-29 21 views
5

Estoy desarrollando una aplicación donde los clientes se conectan a un servidor nodejs a través de Socket.io y se suscriben a una variedad de eventos. Estas suscripciones son bastante complejas y no se pueden manejar con la función de canal de Socket.IO.Cómo simular una falla de conexión en Socket.IO

Esto significa que el cliente necesita realizar un seguimiento de sus suscripciones y puede tener que volver a suscribirse cuando se desconectó. Desafortunadamente, no estoy muy seguro de cómo Socket.IO maneja la reconexión y qué tan transparente le sucede al cliente.

Así que aquí está la pregunta: ¿cómo puedo simular una falla de conexión y forzar a Socket.IO a reconectarse?

+3

Desenchufe el cable de Ethernet y vuelva a enchufarlo? – xavierm02

+0

O tal vez simplemente elimine la conexión de cualquier lado sin cerrarlo antes para ver cómo reacciona el otro lado. – xavierm02

+0

@ xavierm02: Eso funcionaría, pero realmente no es el tipo de enfoque que te gustaría utilizar en pruebas unitarias :-) ¿Y cómo "simplemente elimino" la conexión? – n3rd

Respuesta

-1

Desde mi experiencia, he encontrado que esto es la solución más fácil y útil:

lado del cliente:

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

lado del servidor:

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

Y eso es todo. Muy simple y directo.

También puede agregar en el conector conectado (la última función) algunas actualizaciones más a la pantalla del usuario, como actualizar su índice u otra cosa.

Cuestiones relacionadas