2010-02-08 20 views
5

Después de mi último proyecto tuve el problema de que el cliente esperaba un objeto del servidor, pero al procesar los clientes ingresó una excepción que obliga al servidor a cerrar el socket por razones de seguridad.¿Cómo cerrar correctamente un socket después de que se detecta una excepción?

Esto hace que el cliente finalice de una manera muy desagradable, la forma en que decidí tratar con esto fue enviando al cliente un mensaje de estado de entrada después de cada entrada recibida para que sepa si su entrada se procesó correctamente o si necesita lanzar una excepción

Así que mi pregunta:

  • ¿Existe una manera mejor/más limpio para cerrar la toma después se detecta una excepción?

Respuesta

2

Si entiendo correctamente, usted ya ha cerrado el socket desde el servidor, y necesita que su cliente se dé cuenta de esto y maneje el error en consecuencia.

Eche un vistazo a la documentación Socket y en particular al método setSoTimeout. Por ejemplo, si el tiempo de espera se establece en 5 segundos y el cliente intenta leer desde el socket del servidor y no obtiene una respuesta, el tiempo de espera expira y se genera un java.net.SocketTimeoutException y puede capturarlo y cerrar el socket.

También puede usar ScheduledExecutorService o Timer para simular el tiempo de espera.

2

Por cosas como esta:

  1. Asegúrese de poner este código toma dentro de un bloque try/catch.
  2. Cierre el socket dentro de un 'finally'. De esta forma, se asegura de cerrar limpiamente el socket, independientemente de si hay una excepción o no.
+0

Gracias por su respuesta, yo hago esto, ¿el problema es cómo comunicarle al cliente que su objeto no está llegando? – woolagaroo

0

realmente no se puede ya que el socket está cerrado, se podía escuchar en el cliente para

java.net.SocketException: socket closed 

y luego se sabría que ha perdido la conexión con el servidor.

+0

Incorrecto, ver mi respuesta. No puede 'escuchar' excepciones, y esa excepción no tiene ese significado. – EJP

1

Incorrecto. Esa excepción solo se produce cuando intenta utilizar un socket que ha cerrado.

Lo que el OP debe buscar es EOFException, o IOException: 'connection reset', o una excepción SocketTimeoutException.

+0

Gracias, aprendí algo nuevo. – Greg

Cuestiones relacionadas