Foros del Web » Programación para mayores de 30 ;) » Java »

Problema al detectar si un cliente sigue conectado

Estas en el tema de Problema al detectar si un cliente sigue conectado en el foro de Java en Foros del Web. Buenos Días, Acudo a vosotros ya que tengo un problema con los sockets. Resulta que tengo una clase que hace de servidor esperando conexiones por ...
  #1 (permalink)  
Antiguo 27/05/2009, 08:15
 
Fecha de Ingreso: abril-2007
Mensajes: 40
Antigüedad: 16 años, 11 meses
Puntos: 0
Pregunta Problema al detectar si un cliente sigue conectado

Buenos Días,

Acudo a vosotros ya que tengo un problema con los sockets.

Resulta que tengo una clase que hace de servidor esperando conexiones por X puerto. Una vez establecida una conexion, saca el canal de entrada (inputStream) y el canal de salida (outputStream) del socket cliente y crea 2 hilos. Al crear el primer hilo se le pasa el canal de entrada y el socket y al segundo el canal de salida para que cada uno pueda recibir / enviar datos cuando deseen. Estos mismo hilos tambien se crean en el cliente al conectarse para que tambien puedan enviar y recibir datos cuando deseen. Con esto lo que consigo es una comunicación bidireccional total.

La primera duda es si estoy haciendo bien las cosas para conseguir esa comunicación bidireccional.

Ahora viene el gran problema. Resulta que en los hilos creados, en el metodo run, tengo un while que envia o espera datos y se ejecuta mientras socket.isConnected. Pero el problema es que socket.isConnected siempre me devuelve true, es decir que si paro el cliente, el servidor sigue esperando / enviando datos al cliente con su correspondiente pete ya que el cliente no esta conectado. Mi pregunta es: ¿Como puedo saber cuando un cliente ya no esta conectado al servidor? o mejor dicho ¿Como se cuando un socket se ha cerrado?


Gracias y antemano,
Gabriel
  #2 (permalink)  
Antiguo 27/05/2009, 08:26
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 5 meses
Puntos: 51
Respuesta: Problema al detectar si un cliente sigue conectado

Por lo que dice el API, isConnected unicamente devuelve si el socket se pudo conectar correctamente, no si sigue conectado.

Debido a las idiosincracias de TCP/IP, la unica forma general de saber si el socket del otro lado esta vivo o no es intentar escribirle algo y ver si responde. Por eso en la mayoria de protocolos por encima de TCP/IP se usa un mensaje (ping, isAlive) periodico que sirve para comprobar que la otra parte sigue viva, y que si llegan bien, se ignoran.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #3 (permalink)  
Antiguo 27/05/2009, 10:30
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 5 meses
Puntos: 454
Respuesta: Problema al detectar si un cliente sigue conectado

Hola:

Si en el otro lado te han cerrado la conexión de forma correcta, el read() o el write() debería darte una excepción indicando esta circunstancia.

Si se ha perdido la conexión de forma inesperada, puede ayudarte si pones la opción setKeepAlive(true). Esta opción lo que hace es revisar periódicamente el socket por debajo, de forma que si la conexión se pierde de mala manera, cuando intentes hacer un read() o write() saltará una excepción inmediatamente.

El tiempo por defecto suele ser alto (2 horas), pero la configuración de este tiempo es propia del sistema operativo. Por ejemplo, en unix está en /proc/sys/ipv4/tcp_keepalive_time. Supongo que tendrás que hacer tus pruebas.

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Última edición por chuidiang; 27/05/2009 a las 10:35
  #4 (permalink)  
Antiguo 28/05/2009, 05:36
 
Fecha de Ingreso: abril-2007
Mensajes: 40
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Problema al detectar si un cliente sigue conectado

Gracias a todos por contestar.

El problema lo he resuelto capturando la excepcion SocketException y a continuacion parando el hilo.

Ahora tengo otro problema. Mi servidor esta funcionando perfectamente recibiendo conexiones desde un cliente java. El problema viene cuando intento mandar datos desde un telnet, es decir que me conecto pero al intentar enviar algo me saca del telnet. En el lado del servidor recibo datos de esta forma:

canalEntrada = new ObjectInputStream(socketCliente.getInputStream());
peticion = canalEntrada.readUTF();

El error que me da es: NullPointerException.

Creo que el problema esta en el ObjectInputStream. ¿Deberia usar otra cosa?

Un Saludo,
Gabriel
  #5 (permalink)  
Antiguo 28/05/2009, 06:10
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 5 meses
Puntos: 51
Respuesta: Problema al detectar si un cliente sigue conectado

Lo que te envia un cliente de telnet no es un stream de objetos Java serializados, que sería para lo que usarias un ObjectInputStream. De un cliente de Telnet, como mucho puedes pasarlo a texto y leerlo con un Reader.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #6 (permalink)  
Antiguo 28/05/2009, 07:37
 
Fecha de Ingreso: abril-2007
Mensajes: 40
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Problema al detectar si un cliente sigue conectado

Osea que para recibir datos que no sean de java hay que hacer:

InputStreamReader datos= new InputStreamReader(socketCliente.getInputStream());

while (datos.ready()){
System.out.println((char)datos.read());
}

De funcionar funciona, lo unico que hay mas trabajo.


Saludos
  #7 (permalink)  
Antiguo 23/03/2010, 00:51
 
Fecha de Ingreso: marzo-2010
Mensajes: 3
Antigüedad: 14 años
Puntos: 0
Respuesta: Problema al detectar si un cliente sigue conectado

hola, me gustaria saber si tu servidor envía datos en cualquier momento independientemente de que el cliente le mande uno.
  #8 (permalink)  
Antiguo 23/03/2010, 15:37
 
Fecha de Ingreso: marzo-2010
Mensajes: 1
Antigüedad: 14 años
Puntos: 0
Respuesta: Problema al detectar si un cliente sigue conectado

Hola mali17,

Te confirmo que sí. Mi servidor envia en cualquier momento datos y tambien los puede recibir en cualquier momento. Esto se puede hacer ya que para escribir usas el canal Output y para recibir el canal Input.


Saludos.
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 19:23.