Что может заставить сокет TCP генерировать «java.net.BindException: Address already in using», даже если для адреса повторного использования установлено значение true? Это происходит только в том случае, если приложение быстро перезапускается. Работает на ОС CentOS 5 linux.
Исключение привязки Java
Ответы (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
Если то, что вы говорите, верно, вы сможете перехватить это исключение в цикле и повторить попытку через несколько секунд. (Вы не должны этого делать, но я слышал о некоторых странных вещах о CentOS)
Возникает исключение Java Bind, если ваш порт или InetAddress уже используется и вы хотите использовать его снова. Так что освободите порт, остановите программу, если она запущена. в противном случае измените порт
Спасибо Дипак