Исключение привязки Java

Что может заставить сокет TCP генерировать «java.net.BindException: Address already in using», даже если для адреса повторного использования установлено значение true? Это происходит только в том случае, если приложение быстро перезапускается. Работает на ОС CentOS 5 linux.


person Michael    schedule 11.05.2009    source источник
comment
Вы уверены, что правильно закрыли сокет TCP? Как вы перезапускаете приложение?   -  person AlbertoPL    schedule 11.05.2009
comment
Что-то еще использует этот порт. Какова последовательность событий при перезапуске приложения?   -  person Jeremy Huiskamp    schedule 11.05.2009
comment
Это аппаратный перезапуск приложения, прерванный другим приложением для мониторинга программного обеспечения. (Давайте просто предположим, что это pkill).   -  person Michael    schedule 11.05.2009
comment
Я видел то же самое с .NET в Windows, если серверный процесс был убит вместо обычного завершения.   -  person Matt Solnit    schedule 22.05.2009
comment
Сделайте этот сервер не разорванным :-)   -  person Matt Solnit    schedule 22.05.2009


Ответы (3)


Это как бы объясняет:

http://www.beej.us/guide/bgnet/output/html/singlepage/bgnet.html#bind.

Иногда, как вы могли заметить, вы пытаетесь перезапустить сервер, и bind () терпит неудачу, заявляя, что «Адрес уже используется». Что это обозначает? Ну, немного подключенного сокета все еще висит в ядре и забивает порт. Вы можете либо подождать, пока он очистится (минуту или около того), либо добавить в свою программу код, позволяющий повторно использовать порт, например

(предоставляет код C)

По сути, в C вы вызываете функцию с именем setsockopt (), и один из параметров называется SO_REUSEADDR, что позволяет повторно использовать этот порт.

Я нашел несколько кратких ссылок в Google, которые должны помочь вам понять, как установить эквивалентную опцию в Java:

http://java.sun.com/j2se/1.4.2/docs/guide/net/socketOpt.html

http://java.sun.com/j2se/1.4.2/docs/api/java/net/SocketOptions.html

person poundifdef    schedule 22.05.2009

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

person Peter Lawrey    schedule 11.05.2009

Возникает исключение Java Bind, если ваш порт или InetAddress уже используется и вы хотите использовать его снова. Так что освободите порт, остановите программу, если она запущена. в противном случае измените порт

Спасибо Дипак

person Deepak    schedule 22.05.2009