Wie schließe ich einen Port im Falle einer Programmbeendigung?

8

Ich verwende Socket-Kommunikation in einer meiner Java-Anwendungen. Da ich weiß, ob das Programm irgendeine abnormale Beendigung trifft, werden die Listening-Ports nicht geschlossen und das Programm kann nicht gestartet werden, da es "Port bereits geöffnet" meldet. Muss ich dieses Problem irgendwie lösen? Wie wird diese Angelegenheit allgemein gehandhabt?

    
Chathuranga Chandrasekara 20.04.2009, 07:50
quelle

4 Antworten

22

Es hört sich so an, als würde Ihr Programm auf einem Socket hören. Wenn das Programm beendet wird, schließt das Betriebssystem normalerweise alle Sockets, die möglicherweise geöffnet sind (einschließlich der Überwachung von Sockets). Beim Abhören von Sockets reserviert das Betriebssystem den Port normalerweise für einige Zeit (einige Minuten), nachdem das Programm beendet wurde, damit es alle ausstehenden Verbindungsversuche verarbeiten kann. Sie werden vielleicht bemerken, dass wenn Sie Ihr Programm abnormal herunterfahren, dann kommen Sie später wieder, es wird gut starten.

Wenn Sie diese Verzögerungszeit vermeiden möchten, können Sie setsockopt() verwenden, um den Socket mit der Option SO_REUSEADDR zu konfigurieren. Dies sagt dem Betriebssystem, dass Sie wissen, dass es OK ist, die gleiche Adresse wiederzuverwenden, und Sie werden nicht auf dieses Problem stoßen.

Sie können diese Option in Java mithilfe der ServerSocket.setReuseAddress(true) Methode.

    
Greg Hewgill 20.04.2009, 08:00
quelle
4

Sie möchten das Flag SO_REUSEADDR auf dem Socket

setzen

Siehe Ссылка

    
James Davies 20.04.2009 08:00
quelle
2

Das Betriebssystem sollte solche Dinge automatisch behandeln, wenn der JVM-Prozess beendet ist. Es kann jedoch eine kurze Verzögerung geben, bevor der Port geschlossen wird.

    
Esko Luontola 20.04.2009 07:54
quelle
2

Wie im Umgang mit abnormalen Java-Programm-Exits erwähnt, könnten Sie ein < stark> Runtime.addShutdownHook () Methode, um jeden speziellen Fall zu behandeln, wenn es wirklich eine explizite Operation benötigt.

    
VonC 20.04.2009 07:55
quelle

Tags und Links