2009-04-20 4 views
8

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

ответ

22

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

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

Этот параметр можно установить на Java с помощью метода ServerSocket.setReuseAddress(true).

2

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