Foros del Web » Programando para Internet » Node.js »

Desconexion

Estas en el tema de Desconexion en el foro de Node.js en Foros del Web. Hola! estoy realizando un chat y guardando a los usuarios que se conectan en un objeto de esta forma: Código HTML: //rows es el resultado ...
  #1 (permalink)  
Antiguo 22/01/2014, 10:50
 
Fecha de Ingreso: febrero-2009
Mensajes: 151
Antigüedad: 15 años, 2 meses
Puntos: 1
Desconexion

Hola! estoy realizando un chat y guardando a los usuarios que se conectan en un objeto de esta forma:


Código HTML:
//rows es el resultado de una consulta a una base de datos
socket.identificador=rows[0].id+'_'+new Date().getTime();

                usuariosConectados[socket.identificador]={
                                        'id':rows[0].id,
                                        'nombre': rows[0].display_name,
                                        'socket': socket.id,
                                        'identificador':socket.identificador,
                                        };
Esta funcionando perfectamente pero node en cualquier momento y sin razon aparente hace desaparecer socket.identificador queda en UNDEFINED por lo que cuando el usuario envia un mensaje me tumba el servidor ya que tengo este codigo:

Código HTML:
socket.on("enviarMensaje",function(mensaje)
		{
        var data = [usuariosConectados[socket.identificador].nombre, mensaje, usuariosConectados[socket.identificador].id];
        io.sockets.emit("newMessage",data);     
		});
Nose porque Node hace desaparecer socket.identificador esto afecta a cualquier usuario, ninguno en particular, estoy pensando que quizas es problema de conexion del usuario pero son solo elucubraciones. Les estaria muy agradecido si pudieran darme una idea... cualquiera sea. Gracias!!!
  #2 (permalink)  
Antiguo 22/01/2014, 22:16
Avatar de utan  
Fecha de Ingreso: agosto-2012
Mensajes: 126
Antigüedad: 11 años, 8 meses
Puntos: 17
Respuesta: Desconexion

Hola,

debes comprobar que tu objeto exista para no tener ningún error y la instancia de Node crashee..

Código Javascript:
Ver original
  1. socket.on("enviarMensaje",function(mensaje){
  2.         // comprueba que el objeto exite para node no haga un error out
  3.         if( socket.identificador && usuariosConectados[socket.identificador] ){
  4.             var data = [
  5.                             usuariosConectados[socket.identificador].nombre,
  6.                             mensaje,
  7.                             usuariosConectados[socket.identificador].id
  8.                         ];
  9.             io.sockets.emit("newMessage",data);  
  10.         }
  11. });
__________________
Mis conocimientos son limitado, pero si te puedo ayudar lo are gustoso mi chat particular, visitalo gracias http://rendezvouschat.com
  #3 (permalink)  
Antiguo 22/01/2014, 22:38
 
Fecha de Ingreso: febrero-2009
Mensajes: 151
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Desconexion

Cita:
Iniciado por utan Ver Mensaje
Hola,

debes comprobar que tu objeto exista para no tener ningún error y la instancia de Node crashee..

Código Javascript:
Ver original
  1. socket.on("enviarMensaje",function(mensaje){
  2.         // comprueba que el objeto exite para node no haga un error out
  3.         if( socket.identificador && usuariosConectados[socket.identificador] ){
  4.             var data = [
  5.                             usuariosConectados[socket.identificador].nombre,
  6.                             mensaje,
  7.                             usuariosConectados[socket.identificador].id
  8.                         ];
  9.             io.sockets.emit("newMessage",data);  
  10.         }
  11. });

Hola Utan! muchas gracias por responder!, te comento q eso es lo que hice para de alguna forma solucionar el bug, pero cuando el problema se presenta el usuario se queda sin poder enviar mensajes y sigue viendo correr el chat (los mensajes que mandan los otros participantes), quedando muy inprolijo... ademas de quedar sin explicacion la razon por la cual socket.identificador pasa a ser undefined . Espero alguien nos pueda dar una mano!
  #4 (permalink)  
Antiguo 22/01/2014, 22:56
Avatar de utan  
Fecha de Ingreso: agosto-2012
Mensajes: 126
Antigüedad: 11 años, 8 meses
Puntos: 17
Respuesta: Desconexion

Hola,

En tu logica , cuando haces la connection debes cerciorarte de que cuando se conecta para por tu login y este se le de las propiedades en el objeto..

Esto debes también imprementarlo cuando el socket se desconecta por alguna razón, veo que tu problema pasa por el echo que el usuario se desconecto pero estando logeado en tu aplicación lo cual el ya no tiene el mismo socket si no que se le a dado otro, y pues como no a pasado por el login de nuevo este no es salvado en el objeto de usuarios que tienes..

y por ayi va el problema...

en el cliente , coloca un lisitener de deconecion y asi te daras cuenta que el problema es que se conecto y reconecto.. el cual aunque se aya reconectado no tiene el socket antiguo...

espero me entiendas , tu problema es de session..
__________________
Mis conocimientos son limitado, pero si te puedo ayudar lo are gustoso mi chat particular, visitalo gracias http://rendezvouschat.com
  #5 (permalink)  
Antiguo 22/01/2014, 23:18
 
Fecha de Ingreso: febrero-2009
Mensajes: 151
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Desconexion

Cita:
Iniciado por utan Ver Mensaje
Hola,

En tu logica , cuando haces la connection debes cerciorarte de que cuando se conecta para por tu login y este se le de las propiedades en el objeto..

Esto debes también imprementarlo cuando el socket se desconecta por alguna razón, veo que tu problema pasa por el echo que el usuario se desconecto pero estando logeado en tu aplicación lo cual el ya no tiene el mismo socket si no que se le a dado otro, y pues como no a pasado por el login de nuevo este no es salvado en el objeto de usuarios que tienes..

y por ayi va el problema...

en el cliente , coloca un lisitener de deconecion y asi te daras cuenta que el problema es que se conecto y reconecto.. el cual aunque se aya reconectado no tiene el socket antiguo...

espero me entiendas , tu problema es de session..
Sisi entiendo perefcto lo que dices... mira esto tengo

Código HTML:
io.sockets.on('connection', function (socket) {
    
    socket.on('verifico_permisos', function (data) {
        
            connection.query("SELECT id,display_name from users where user_login = '"+data['usuario']+"' and user_pass='"+data['pass']+"'", function(err, rows, fields) {
                
                socket.identificador=rows[0].id+'_'+new Date().getTime();

                //Lo agrego al objeto
                usuariosConectados[socket.identificador]={
                                        'id':rows[0].id,
                                        'nombre': rows[0].display_name,
                                        'socket': socket.id,
                                        'identificador':socket.identificador,
                                        };
                
                usuario=[socket.identificador,rows[0].display_name];
                //envio a los usuarios conectados el nuevo usuario                			
                socket.broadcast.emit("conectado",usuario);
                //envio al nuevo usuario la lista de todos los usuarios                    
                socket.emit("me_conecte",usuariosConectados);             
                  	
            })
          });
Alli cuando el usuario ingresa pasa por esa revision... si se desconectara no deberia saltar esta otra funcion que tengo tambien:

Código HTML:
socket.on('disconnect', function () 
		{
			//Eliminamos al usuario de los conectados
			delete usuariosConectados[socket.identificador];			
			//Mandamos la información a las Sockets
			socket.broadcast.emit("usuarioDesconectado",socket.identificador);
     
		});
¿Podrias darme un ejemplo de como colocar el listener que dices?

Mil gracias por tu ayuda!!!
  #6 (permalink)  
Antiguo 23/01/2014, 00:26
Avatar de utan  
Fecha de Ingreso: agosto-2012
Mensajes: 126
Antigüedad: 11 años, 8 meses
Puntos: 17
Respuesta: Desconexion

hola,

El evento "verifico_permisos" debe ser reinitializado cuando tu usuario se desconecta por alguna razón..

En el cliente si el usuario esta en la aplicación y este se desconecta, no manda el socket.emit("verifico_permisos"); de nuevo, lo cual en el server este solo no crea esta nueva conexion en tu users..

Entonces, cuando tu usuario entra a tu aplicación esta manda "verifico_permisos" y puede usar tu aplicación pero cuando por alguna razón su conneccion se desconecta este estando en el browser no hay ningun evento que detecte la desconexion y que mande "verifico_permisos" otra ves..

propongo este ejemplo..

server:

Código Javascript:
Ver original
  1. // server
  2.         io.sockets.on('connection' , function( socket ){
  3.             socket.on('verifico_permisos', function ( data ) {
  4.             // hacemos tu login
  5.             });
  6.         });
cliente
Código Javascript:
Ver original
  1. //cliente
  2.         client.on('connect', function(){
  3.             // mandas tus credenciales al conectarte
  4.            
  5.             client.emit( 'verifico_permisos' , data );
  6.         });
  7.         client.on('disconnect', function(){
  8.             /** ok, el cliente se desconecto, pero como no esta recargando la pagina
  9.              * debemos emitir "verifico_permisos" nuevamente con las credenciale, ya que
  10.              * la pagina del cliente ya esta cargada y ya emitio las credenciales.
  11.              */
  12.              client.emit( 'verifico_permisos' , data );
  13.         });

Otra manera (no mi option) seria que forzarar un refresh a tu pagina cuando tu cliente detecte el evento 'disconnect'...
espero te aya ayudado.
__________________
Mis conocimientos son limitado, pero si te puedo ayudar lo are gustoso mi chat particular, visitalo gracias http://rendezvouschat.com

Última edición por utan; 23/01/2014 a las 00:40
  #7 (permalink)  
Antiguo 23/01/2014, 09:46
 
Fecha de Ingreso: febrero-2009
Mensajes: 151
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Desconexion

Cita:
Iniciado por utan Ver Mensaje
hola,

El evento "verifico_permisos" debe ser reinitializado cuando tu usuario se desconecta por alguna razón..

En el cliente si el usuario esta en la aplicación y este se desconecta, no manda el socket.emit("verifico_permisos"); de nuevo, lo cual en el server este solo no crea esta nueva conexion en tu users..

Entonces, cuando tu usuario entra a tu aplicación esta manda "verifico_permisos" y puede usar tu aplicación pero cuando por alguna razón su conneccion se desconecta este estando en el browser no hay ningun evento que detecte la desconexion y que mande "verifico_permisos" otra ves..

propongo este ejemplo..

server:

Código Javascript:
Ver original
  1. // server
  2.         io.sockets.on('connection' , function( socket ){
  3.             socket.on('verifico_permisos', function ( data ) {
  4.             // hacemos tu login
  5.             });
  6.         });
cliente
Código Javascript:
Ver original
  1. //cliente
  2.         client.on('connect', function(){
  3.             // mandas tus credenciales al conectarte
  4.            
  5.             client.emit( 'verifico_permisos' , data );
  6.         });
  7.         client.on('disconnect', function(){
  8.             /** ok, el cliente se desconecto, pero como no esta recargando la pagina
  9.              * debemos emitir "verifico_permisos" nuevamente con las credenciale, ya que
  10.              * la pagina del cliente ya esta cargada y ya emitio las credenciales.
  11.              */
  12.              client.emit( 'verifico_permisos' , data );
  13.         });

Otra manera (no mi option) seria que forzarar un refresh a tu pagina cuando tu cliente detecte el evento 'disconnect'...
espero te aya ayudado.
Buenisimo Utan!! ahora pregunta:

¿No seria conveniente utilizar client.on('disconnect' para mostrar alguna adevertencia al usuario solamente... en lugar de hacer client.emit( 'verifico_permisos' porque si el usuario continua deconectado como que no tendria mucho sentido...

Por otro lado yo no tenia:

Código HTML:
client.on('connect', function(){
            // mandas tus credenciales al conectarte
           
            client.emit( 'verifico_permisos' , data );
        });
yo tenia solo:

Código HTML:
client.emit( 'verifico_permisos' , data );
creo que al agregarle el client.on ya reconectaria automaticamente cuando vuelva la conexion sin necesidad de hacerlo desde el disconnect. Decime si esta correcta mi logica... Mil gracias por tu ayuda utan!!!
  #8 (permalink)  
Antiguo 23/01/2014, 10:32
Avatar de utan  
Fecha de Ingreso: agosto-2012
Mensajes: 126
Antigüedad: 11 años, 8 meses
Puntos: 17
Respuesta: Desconexion

Hola,

Cuando tengo un 'disconnect' en mu cliente , lo que hago esque reseteo el nicklist, todos los objetos y elementos en my aplicación , entonces ya reseteado todo los objetos pertinentes el al reconectarse estos vuelven a obtener información fresca del usuario y usurios sin este refrescar la pagina..

Cita:
¿No seria conveniente utilizar client.on('disconnect' para mostrar alguna adevertencia al usuario solamente... en lugar de hacer client.emit( 'verifico_permisos' porque si el usuario continua deconectado como que no tendria mucho sentido...
Dije eso, porque amenos que tu aplicacion haga en reconect automaticamente en el disconnect haces el reconect y envias tus credenciales.
Ya que sospechaba que tu no mandabas tus credenciales en on.('connect')

Tambien como te comente puedes en el disconnect puedes mostrar información que se desconecto y que haga algo que tu quieras el cliente.

Cita:
creo que al agregarle el client.on ya reconectaria automaticamente cuando vuelva la conexion sin necesidad de hacerlo desde el disconnect.
Si es posible que funcione, hasta el momento enque data este definido y que mantenga las credenciales que mandastes al principio..

Si embargo , tendras que resetear todo objecto determinado importante en tu cliente en el evento disconnect..
__________________
Mis conocimientos son limitado, pero si te puedo ayudar lo are gustoso mi chat particular, visitalo gracias http://rendezvouschat.com

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:06.