2009-09-07 38 views
23

Estoy tratando de averiguar si un socket Java TCP es actualmente conectado, lo siguiente simplemente parece indicarme si el socket se ha conectado en algún momento, no si todavía está conectado.¿Cómo puedo verificar si un socket está actualmente conectado en Java?

socket.isConnected(); 

Cualquier ayuda apreciada, gracias.

+3

http://stackoverflow.com/questions/969866/java-detect-lost-connection – Aziz

+1

Y otra http://stackoverflow.com/questions/485855/how-do-you-handle- socket-disconnecting-in-java –

+0

Respondido [aquí] (http://stackoverflow.com/a/17889321/207421). – EJP

Respuesta

14

Suponiendo que tiene cierto nivel de control sobre el protocolo, soy un gran fan de enviar mensajes de texto para verificar que la conexión esté activa. Se ha demostrado que es el método más a prueba de fallas y, a menudo, le brindará la notificación más rápida cuando se rompa una conexión.

TCP keepalives funcionará, pero ¿qué pasa si el host remoto se apaga de repente? El TCP puede demorar mucho tiempo. Por otro lado, si tienes lógica en tu aplicación que espera una respuesta de latido cada x segundos, la primera vez que no la obtienes sabes que la conexión ya no funciona, ya sea por una red o por un problema del servidor en el lado remoto .

Consulte Do I need to heartbeat to keep a TCP connection open? para obtener más información.

16
  • socket.isConnected() devuelve siempre verdadero una vez que el cliente se conecta (¡e incluso después de la desconexión) raro!
  • socket.getInputStream().read()
    • hace que la espera de rosca para la entrada, siempre y cuando el cliente está conectado y por lo tanto hace que su programa no hace nada - excepto si se obtiene alguna entrada
    • returns -1 si el cliente está desconectado
  • socket.getInetAddress().isReachable(int timeout): De isReachable(int timeout)

    Pruebe si esa dirección es alcanzable. La implementación se esfuerza al máximo para tratar de llegar al host, pero los cortafuegos y la configuración del servidor pueden bloquear las solicitudes, lo que da como resultado un estado inalcanzable, mientras que algunos puertos específicos pueden ser accesibles. Una implementación típica usará PETICIONES DE ECO de ICMP si se puede obtener el privilegio; de lo contrario, intentará establecer una conexión TCP en el puerto 7 (Eco) del host de destino.

+1

¿Qué hay en "out.checkError()"? ¿Te refieres a System.out? No creo que eso funcione. – RoboAlex

+7

Incorrecto. 'checkError() le dice si ha habido * I * Exception antes de usar el socket. No * se convierte en realidad 'tan pronto como el cliente se desconecta'. -1 – EJP

Cuestiones relacionadas