2009-04-20 5 views
8

Utilizzo la comunicazione Socket in una delle mie applicazioni Java.Come faccio sapere se il programma incontra eventuali terminazioni anomale le porte di ascolto non vengono chiuse e il programma non può essere riavviato perché riporta "Porta già aperta .." Do Devo comunque gestire questo problema? Qual è il modo generale utilizzato per gestire questa questione?Come si chiude una porta in caso di interruzione del programma?

risposta

22

Sembra che il programma sia in ascolto su una presa. Normalmente, quando il tuo programma esce dal sistema operativo, chiude tutti i socket che potrebbero essere aperti (inclusi i socket di ascolto). Tuttavia, per i socket di ascolto il sistema operativo normalmente riserva la porta per un po 'di tempo (alcuni minuti) dopo la chiusura del programma, in modo che possa gestire qualsiasi tentativo di connessione in sospeso. Si può notare che se si spegne il programma in modo anomalo, quindi si ritorna qualche tempo dopo si avvierà correttamente.

Se si desidera evitare questo ritardo, è possibile utilizzare setsockopt() per configurare il socket con l'opzione SO_REUSEADDR. Questo dice al sistema operativo che sai che è OK riutilizzare lo stesso indirizzo, e non ti imbatterai in questo problema.

È possibile impostare questa opzione in Java utilizzando il metodo ServerSocket.setReuseAddress(true).

2

Il sistema operativo deve gestire cose del genere automaticamente, quando il processo JVM è terminato. Tuttavia, potrebbe esserci un breve ritardo prima che la porta venga chiusa.

Problemi correlati