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?
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.
Sie möchten das Flag SO_REUSEADDR auf dem Socket
setzenSiehe Ссылка
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.
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.
Tags und Links java multithreading sockets jvm