Как закрыть порт в случае завершения программы?

Я использую связь сокетов в одном из моих приложений Java.Как я знаю, если программа встречает какое-либо ненормальное завершение, порты прослушивания не закрываются, и программа не может быть запущена обратно, потому что она сообщает "порт уже открыт.." Должен ли я вообще решать эту проблему? Каков общий подход к решению этого вопроса?

4 ответов


похоже, что ваша программа прослушивает сокет. Обычно при выходе из программы ОС закрывает все сокеты, которые могут быть открыты (включая прослушивающие сокеты). Однако для прослушивания сокетов ОС обычно резервирует порт в течение некоторого времени (несколько минут) после выхода программы, чтобы она могла обрабатывать любые невыполненные попытки подключения. Вы можете заметить, что если вы закрыли свою программу ненормально, то вернетесь через некоторое время, она начнет работать нормально.

Если вы хотите избежать этого времени задержки, вы можете использовать setsockopt() для настройки сокета с параметром SO_REUSEADDR. Это говорит ОС, что вы знаете, что можно повторно использовать один и тот же адрес, и вы не столкнетесь с этой проблемой.

вы можете установить эту опцию в Java, используя ServerSocket.setReuseAddress(true) метод.


вы хотите установить флаг SO_REUSEADDR на сокете

см http://java.sun.com/j2se/1.4.2/docs/api/java/net/ServerSocket.html#setReuseAddress(boolean)


операционная система должна обрабатывать такие вещи автоматически, когда процесс JVM закончился. Однако может быть небольшая задержка до закрытия порта.


Как говорится в обработка аномальных выходов Java-программы, вы можете настроить во время выполнения.методы addshutdownhook() метод имеет дело с любым частным случаем, если ему действительно нужна явная операция.