2010-02-08 11 views
5

Dopo il mio ultimo progetto ho avuto il problema che il client si aspettava un oggetto dal server, ma durante l'elaborazione dei client è stata rilevata un'eccezione che costringe il server a chiudere il socket per motivi di sicurezza.Come chiudere correttamente un socket dopo che è stata rilevata un'eccezione?

Ciò causa la chiusura del client in un modo molto spiacevole, il modo in cui ho deciso di gestire questo è stato inviare al client un messaggio di stato Input dopo ogni input ricevuto in modo che egli sappia se il suo input è stato elaborato correttamente o se ha bisogno gettare un'eccezione

Quindi la mia domanda:

  • Esiste un/modo migliore più pulito per chiudere la presa dopo un'eccezione viene catturato?

risposta

2

Se ho capito bene, hai già chiuso il socket dal lato server, e hai bisogno del tuo client per realizzare questo e gestire l'errore di conseguenza.

Dai uno sguardo alla documentazione Socket e in particolare al metodo setSoTimeout. Ad esempio, se il timeout è impostato su 5 secondi e il client tenta di leggere dal socket del server e non ottiene una risposta, il timeout scade e viene sollevato un numero java.net.SocketTimeoutException e lo si può intercettare e chiudere il socket.

È anche possibile utilizzare ScheduledExecutorService o Timer per simulare il timeout.

2

per cose come questa:

  1. Assicurati di inserire questo codice presa all'interno di un blocco try/catch.
  2. Chiudere il socket all'interno di un 'finally'. In questo modo ti assicuri di chiudere il socket in modo pulito, a prescindere che esista o meno un'eccezione.
+0

Grazie per la risposta, lo faccio già il problema è come comunicare al client che il suo oggetto non sta arrivando? – woolagaroo

0

davvero non si può in quanto il socket viene chiuso, si poteva ascoltare sul client per

java.net.SocketException: socket closed 

e poi si sa che hai perso una connessione al server.

+0

Errato, vedere la mia risposta. Non è possibile "ascoltare" le eccezioni e quell'eccezione non ha questo significato. – EJP

1

errato. Questa eccezione si verifica solo quando si tenta di utilizzare una presa che si è chiuso.

Ciò che l'OP deve cercare è EOFException o IOException: "reset connessione" o SocketTimeoutException.

+0

Grazie, ho imparato qualcosa di nuovo. – Greg

Problemi correlati