Wie schließe ich einen port in einem Fall der Beendigung des Programms?
Bin ich mit Socket-Kommunikation in einem meiner Java-Anwendungen.Wie weiß ich, ob das Programm erfüllt alle abnormalen Beendigung der listening-ports nicht geschlossen und das Programm kann nicht gestartet werden, zurück, weil es Berichte "Port bereits geöffnet ist."
Muss ich sowieso, dieses problem zu behandeln? Was ist der Allgemeine Weg für den Umgang mit dieser Materie?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es klingt wie dein Programm lauscht auf einem sockel. Normalerweise, wenn Ihr Programm beendet die OS schließt alle sockets, die möglicherweise geöffnet sind (einschließlich listening sockets). Jedoch, für listening sockets OS normalerweise behält sich der Hafen für einige Zeit (mehrere Minuten), nachdem Sie Ihr Programm beendet, so kann es der Griff einer hervorragenden Verbindung versucht. Sie können feststellen, dass, wenn Sie schalten Sie Ihr Programm ungewöhnlich, dann wieder einige Zeit später wird es anfangen, sich nur in Ordnung.
Wollen Sie diese Verzögerung vermeiden, die Zeit, die Sie verwenden können
setsockopt()
konfigurieren Sie die Buchse mit dem SO_REUSEADDR-option. Dies sagt dem Betriebssystem, dass Sie wissen, es ist OK, um die Wiederverwendung der gleichen Adresse, und du wirst nicht in dieses problem.Können Sie diese option in Java mithilfe der
ServerSocket.setReuseAddress(true)
Methode.Wollen Sie das SO_REUSEADDR-flag auf dem sockel
Sehen http://java.sun.com/j2se/1.4.2/docs/api/java/net/ServerSocket.html#setReuseAddress(boolean)
Sollte das Betriebssystem die Dinge handhaben wie, dass automatisch, wenn die JVM-Prozess beendet hat. Gibt es möglicherweise eine kurze Verzögerung, bevor der port geschlossen ist, obwohl.
Wie gesagt in den Umgang mit anormalen Java-Programm beendet, könnten Sie setup ein - Laufzeit.addShutdownHook() - Methode befasst sich mit einem speziellen Fall, wenn es wirklich benötigt eine explizite operation.