Как закрыть порт в случае завершения программы? - PullRequest
8 голосов
/ 20 апреля 2009

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

Ответы [ 4 ]

22 голосов
/ 20 апреля 2009

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

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

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

4 голосов
/ 20 апреля 2009

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

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

2 голосов
/ 20 апреля 2009

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

2 голосов
/ 20 апреля 2009

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

...