Как устранить ошибку "java.net.BindException: адрес уже используется: JVM_Bind"?

В Eclipse я получил эту ошибку:

run:
     [java] Error creating the server socket.
     [java] Oct 04, 2012 5:31:38 PM cascadas.ace.AceFactory bootstrap
     [java] SEVERE: Failed to create world : java.net.BindException: Address already in use: JVM_Bind
     [java] Java Result: -1
BUILD SUCCESSFUL
Total time: 10 seconds

Я не уверен, почему это появилось сейчас, но все прошло нормально всего несколько часов назад. Нужно ли перезагрузить мою машину? Как мне добраться до сути? Я ценю любые советы или рекомендации.

22 ответа

Решение

Да, у вас есть другой процесс, связанный с тем же портом.

TCPView (только для Windows) из Windows Sysinternals - мое любимое приложение, когда у меня возникает ошибка JVM_BIND. Он показывает, какие процессы прослушивают какой порт. Он также предоставляет удобное контекстное меню, чтобы либо убить процесс, либо закрыть мешающее соединение.

Если вы знаете, на каком порту запущен процесс, вы можете набрать: lsof -i:<port>,

Например, lsof -i:8080, чтобы отобразить процесс (pid), запущенный на порте 8080.

Затем убить процесс с kill <pid>

В окнах

netstat -ano

перечислит все протоколы, порты и процессы прослушивания. использование

taskkill -pid "proces to kill" /f

убить процесс прослушивания порта. например

 taskkill -pid 431 /f

В Ubuntu/Unix мы можем решить эту проблему, выполнив 2 шага, как описано ниже.

 1. Use netstat -plten |grep java

Это даст вывод, как это

tcp   0   0 0.0.0.0:8080   0.0.0.0:*  LISTEN   1001  76084  9488/java       

Здесь номер порта 8080, на котором запущен процесс Java. И его идентификатор процесса (pid) 9488 перед Ява (9488/java).

2. Now to resolve the Address already in use problem you
have to kill this process using this command.

kill -9 9488

Здесь: -9 для принудительной остановки и 9488 - идентификатор процесса.

Теперь снова запустите сервер. Надеюсь, этот ответ будет полезен для вас, ребята.

В Mac:

Убить процесс Терминал: kill <pid>

Найти pid: Терминал: lsof -i:<port>

От Диего Пино отвечу

(Только для Windows)

Чтобы убить процесс, сначала нужно найти идентификатор процесса (pid).

Запустив команду:

netstat -ano | findstr :yourPortNumber

Как показано на рисунке ниже

Вы получите свой Идентификатор процесса (PID). Теперь, чтобы убить тот же процесс, выполните следующую команду:

taskkill /pid yourid /f

Для окон:

  1. Найдите идентификатор процесса

    netstat -nao | найти "8080"

Он покажет вам идентификатор процесса в виде числа.

Пример:

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       18856

Здесь 18856 - идентификатор процесса.

  1. Убейте этот процесс

    taskkill /PID 18856 /F

Выход: УСПЕХ: процесс с PID 18856 был прекращен.

Здесь, используя taskkill, вы убиваете идентификатор процесса:18856

Для linux / Mac:

sudo kill -9 $(sudo lsof -t -i:8080)

Здесь вы найдете процесс использования sudo lsof -t -i:8080 и убивая его командой sudo kill

У вас есть другой процесс, работающий на том же порту.

Вы можете попытаться убить одну из служб java.exe, запущенных в вашем диспетчере задач - ps убедитесь, что вы не уничтожили eclipse, поскольку он также указан как java.exe. Если больше ничего не работает, перезапуск вашей машины все равно исправит это. Похоже, вы не закрыли сокет из предыдущего теста. Надеюсь это поможет.

Для тех, кто ищет самый простой из ответов (поскольку это то, что мы обычно упускаем), просто остановите запущенный проект и запустите его снова. В большинстве случаев мы забываем остановить проект, который запускали ранее, и при повторном запуске проекта возникает такая проблема.

Я также прилагаю фотографию, чтобы сделать ее более понятной (я использую 'Spring tool suite'). Так что вам нужно либо нажать кнопку справа, если вы хотите перезапустить тот же проект, либо сначала нажать кнопку, расположенную на 2-й позиции справа, чтобы остановить ваш проект, а затем кнопку слева, чтобы запустить ваш проект. Я надеюсь, что это решит проблему немногих из новых программистов.:)

В строке Windows CMD найдите идентификатор процесса, который удерживает соединение через порт привязки, введя следующую команду:

C:> netstat -a -o

-а показать все соединения

-о показать идентификатор процесса

И затем прекратить процесс.

Вам нужно закрыть свой порт, если вы являетесь пользователем Linux, а затем введите

fuser -k 8080/tcp

Это исключение BindException возникает, когда другой процесс уже запущен в указанном порту (8080).

Вы можете использовать любой из следующих подходов.

  1. Измените порт сервера: если вы используете сервер Tomcat и IntelliJ IDE, вы можете настроить порт сервера, настроив сервер Tomcat.

или

  • Перейдите в папку tomcat>conf
  • Отредактируйте server.xml
  • Искать "Порт коннектора"
  • Замените "8080" номером вашего порта.
  • Перезагрузите сервер tomcat.
  1. Завершите существующий запущенный процесс в этом порту и запустите сервер.

Для Linux / Mac

       sudo kill -9 $(sudo lsof -t -i:8080)

Для Windows

       netstat -ano | findstr :8080
taskkill /PID typeyourPIDhere /F 

Примечание: (/ F принудительно завершает процесс)

Да, как сказал Гвидо Симоне, потому что другой процесс прослушивает тот же порт. Если вы находитесь в Ubuntu, вы можете просто убить этот процесс, дав командуsudo kill $(sudo lsof -t -i:[port number])

например: sudo kill $(sudo lsof -t -i:8080)

Но однажды это не сработало для меня. я дал команду

$ lsof -i:[port] 

и это ничего не показывает.

Я проверил мои док-контейнеры с помощью командыdocker ps -a но ни один из них не жив. Все контейнеры остановлены (но я помню, я остановил один контейнер, который использовался один и тот же порт несколько минут назад.). Чтобы убедиться, что докер не является причиной, я остановил весь процесс докера с помощью команды sudo service docker stop и попробуй еще раз. Удивительно, но затмение не показало ошибку в то время. Она отлично запускала мою программу.

Надеюсь, мой опыт кому-нибудь поможет.

Порт уже используется каким-то другим процессом, так как @Diego Pino сказал, что вы можете использовать lsof в unix, чтобы найти процесс и убить соответствующий, если вы находитесь в Windows, используйте netstat -ano, чтобы получить все pid процесса и порты, которые каждый приобретает. найдите нужный порт и убейте.

чтобы было очень просто перезапустить машину, если это возможно:)

В моем случае Tomcat работал в фоновом режиме. Я установил его как внешний сервлет при использовании Eclipse. С Spring Boot в Intellij у него есть собственный сервер, но он не может запуститься, пока он уже занят.
В моем случае Tomcat запускается автоматически, я включаю свою ОС, поэтому мне нужно выключить его вручную:

$ sudo service tomcat stop

конечно, "кот" зависит от того, какую версию кота вы используете.
Надеюсь, это может кому-то помочь.

Перезагрузите компьютер один раз, я думаю, что он будет работать. Это начало работать в моем случае. Еще одну вещь можно сделать, перейдите в диспетчер задач и завершите процесс.

Скриншот для справки

(1) проверить, используется порт или нет, убить этот процесс

$ lsof -i:[порт]

(2) другая причина - порт используется ipv6, решение:

редактировать /etc/sysctl.conf

добавить это в файл

net.ipv6.conf.all.disable_ipv6 = 1

тогда сделай это эффект

$ sudo sysctl -p /etc/sysctl.conf

или просто перезагрузите

Вы можете закрыть все Java-процессы и снова запустить приложение:

taskkill /F /IM java.exe

запустите приложение снова...

Ваш порт должен быть занят каким-то другим процессом. Таким образом, вы можете скачать TCPView на https://technet.microsoft.com/en-us/sysinternals/bb897437 и завершить процесс для используемого порта.

Если вы не знаете свой порт, дважды щелкните по серверу, который не запускается, нажмите "Открыть страницу свойств сервера" и нажмите "Glassfish" в левом столбце. Вы найдете порты здесь.

Я столкнулся с подобной проблемой в Eclipse, когда две консоли были открыты, когда я сначала запустил программу сервера, а затем программу клиента. Раньше я останавливал программу в единственной консоли, думая, что она закрыла сервер, но закрыла только клиент, а не сервер. Я нашел запущенные процессы Java в моем диспетчере задач. Эта проблема была решена путем закрытия как Серверных, так и Клиентских программ с их отдельных консолей (Eclipse показывает консоль последней активной программы). Поэтому, когда я снова запустил серверную программу, порт снова был открыт для захвата.

На самом деле я просто использовал кнопку «Завершить» на вкладке «Консоль». Это маленькая красная коробка. Надеюсь, это поможет.

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

Настройте ваше приложение на использование любого другого свободного порта, и вы увидите, что ваше приложение работает.

Другие вопросы по тегам