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
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)
.
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.
Come menzionato nel Handling abnormal Java program exits, si potrebbe configurare un metodo Runtime.addShutdownHook() ad offerte con qualsiasi caso speciale, se ha bisogno davvero di un'operazione esplicita.
si desidera impostare il flag SO_REUSEADDR sulla presa
Vedi http://java.sun.com/j2se/1.4.2/docs/api/java/net/ServerSocket.html#setReuseAddress(boolean)
- 1. La finestra del programma di debug non si chiude
- 2. Il programma si blocca quando si chiude la connessione della porta seriale
- 3. Input/OutputStreams si chiude in caso di distruzione?
- 4. 0 in caso di interruzione?
- 5. Come si "chiude" un ClassLoader?
- 6. impostazione interruzione porta seriale in linux
- 7. riferimento enumerazione in caso di interruzione
- 8. Il client Jersey chiude la connessione in caso di eccezione?
- 9. Il programma Clojure non si chiude al termine dell'ultima istruzione?
- 10. Devo liberare memoria allocata in caso di interruzione anomala?
- 11. Programma terminale porta COM
- 12. Come uscire da un programma batch in caso di errore?
- 13. node.js: il programma si chiude in modo imprevisto o si blocca semplicemente
- 14. Come si chiude una finestra aperta automaticamente in Emacs?
- 15. Come si chiude una connessione Server-Invia eventi in Flask?
- 16. Visual Studio 2012 si blocca quando si chiude una soluzione
- 17. Tkinter askopenfilename() non si chiude
- 18. La console # c non si chiude dopo la fine del programma
- 19. Come si aggiunge un punto di interruzione in Xcode?
- 20. LED di programma con solo porta USB
- 21. Chiedere conferma quando si chiude una scheda
- 22. Come si chiude una pagina MVC ASP.NET dal controller?
- 23. non si chiude dopo Firebase una volta
- 24. Come si chiude correttamente un'applicazione winform in C#?
- 25. Arresta il programma SAS in caso di errore
- 26. chiusura di una finestra interruzione del ciclo di eventi assunto
- 27. parent.jQuery.fancybox.close(); dall'interno di Fancybox si chiude solo Fancybox una volta
- 28. Chiude l'applicazione all'arresto del sistema
- 29. Perché SparkContext si chiude a caso e come lo riavvii da Zeppelin?
- 30. Miglioramento del debug in caso di arresto anomalo di Linux in un programma C