Забыть закрыть ServerSocket - PullRequest
       5

Забыть закрыть ServerSocket

2 голосов
/ 29 декабря 2010

Если моя программа не выполняет ServerSocket.close() и / или Socket.close() до ее завершения, при следующем запуске программы она всегда выдаст IOException при попытке начать прослушивание через порт.

Обычно это происходит не потому, что я забываю поставить close() в конце программы, а когда я принудительно закрываю программу и никогда не смогу выполнить close().Похоже, мне нужно выйти и войти в систему на моем компьютере с Linux, чтобы избавиться от «занятого сокета».Мне было интересно, если кто-нибудь знает, как я мог бы очистить любые незакрытые сокеты в случае принудительного завершения работы сервера из Терминала или любым другим способом?

Я уже пытался отключить и включить сетевые подключения, но все равно не повезло.1010 *

Ответы [ 7 ]

5 голосов
/ 30 декабря 2010

Вопреки вашему убеждению, вы не прекращаете свою программу.Если бы это было так, сокет был бы освобожден, и я не думаю, что вы нашли ошибку в ядре Linux здесь:).

Возможно, ваш основной поток завершился, нов вашем приложении по-прежнему работают потоки, не являющиеся демонами, которые будут поддерживать JVM в рабочем состоянии.

После создания потоков вы должны вызвать myThread.setDaemon (true).

0 голосов
/ 10 января 2011

Какая у вас "программа"?Является ли он владельцем процесса или это просто какой-то модуль для подключения в контейнер.Завершение процесса закрывает все сокеты, связанные с указанным процессом, поэтому не нужно явно указывать close () или, по крайней мере, не предотвращать java.net.BindException.

Вы уверены, что программа фактически прекращает свое выполнениеЭто должно быть вашей главной заботой.

0 голосов
/ 29 декабря 2010

Поскольку вы беспокоитесь о том, что произойдет в случае неожиданной остановки JVM, на мой взгляд, вам нужны крюки отключения. Взгляните на следующую ссылку: http://www.devx.com/getHelpOn/10MinuteSolution/20459/1954

0 голосов
/ 29 декабря 2010

Используйте команду "netstat -a", чтобы проверить состояние этого порта. Я подозреваю, что это будет в закрытом ожидании. Это тот случай, когда TCP работает так, как задумано, и будет отображаться на любом языке и в любой ОС. В конце концов ядро ​​прекратит ожидание, пока ваша программа закроет сокет и очистит его. Вы можете сократить этот тайм-аут, но лучшее решение - убедиться, что ваши программы корректно завершают работу.

0 голосов
/ 29 декабря 2010

/etc/init.d/networking restart

0 голосов
/ 29 декабря 2010

Вы вызываете [setReuseAddress()][1] на ServerSocket перед его привязкой? Если нет, то попробуйте это.

0 голосов
/ 29 декабря 2010

перезагрузка сети sudo / sbin / service

...