Як вирішити помилку “java.net.BindException: Адреса, яка вже використовується: JVM_Bind”?


187

У 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

Я не впевнений, чому він з’явився зараз, але він пройшов чудово лише кілька годин тому. Чи потрібно перезавантажувати машину? Як я можу дістатись до неї? Я ціную будь-які поради чи поради.


1
Я часто бачив це на машинах розробки, коли ви виконуєте випробування коду - Як можна уникнути проблеми?
буде

Відповіді:


141

Так, у вас є інший процес, прив'язаний до того ж порту.

TCPView (лише для Windows) від Windows Sysinternals - це моє улюблене додаток, коли у мене є помилка JVM_BIND. Він показує, які процеси прослуховуються, на якому порту. Він також пропонує зручне контекстне меню, щоб або вбити процес, або закрити з'єднання, яке стає на шляху.


швидка робота навколо: відкрити подання сервера> двічі клацнути на сервері> змінити використовувані номери портів (наприклад, для адміністратора Tomcat, HTTP / 1.1 та AJP / 1.3)
Adrien Be

2
@novice_developer netstat- це команда, яку ви шукаєте, з опціями -a та -p, man netstatваш друг для всіх інших :)
sox з Monica

1
Якщо вищезгаданий процес не працює, то перезавантажте ПК один раз, я думаю, він буде працювати. Це почало працювати в моєму випадку.
Кумар

195

Якщо ви знаєте , який порт процес запущений, можна ввести: lsof -i:<port>.

Наприклад, lsof -i:8080щоб перелічити процес (pid), що працює на порту 8080.

Потім вбити процес за допомогою kill <pid>


4
Так, це Linux. Потім спробуйте щось еквівалентне в Windows. Можливо, це може допомогти: stackoverflow.com/questions/15708/lsof-equivalent-for-windows
Дієго Піно

1
тому я використовую Raspbian, і він говорить: bash: lsof: команда не знайдена. будь-які пропозиції?
Мона Джалал

1
@MonaJalal hmmm не впевнений, але, можливо, спробуйте щось на кшталтsudo apt-get install lsof
Кава

@DiegoPino Я зіткнувся з тією ж помилкою, яку java.net.BindException: Address already in use (Bind failed) я використав lsof -i:8080і отримав tcp6 0 0 :::8080 :::* LISTEN 106872/java. Що я повинен зробити ? Вбити Яву ??
Avijit

@AvijitBarua Ідентифікатор процесу (pid) програми java, прив'язаного до цього порту, становить 106872. Кожна програма, яку ви запускаєте, представляє себе як програма java (саме віртуальна машина java запускає ваш скомпільований код). Так що так, ви можете вийти з цієї програми Java або вбити її, якщо це не якийсь критичний (системний) інструмент, а ваша власна програма; подивитись на диспетчера завдань, як htop. Можливо, ви намагаєтеся прив’язати до порту, використовуваного дійсною програмою, який не слід вбивати.
xuiqzy

114

У вікнах

netstat -ano

перелічить усі протоколи, порти та процеси прослуховування. Використовуйте

taskkill -pid "proces to kill" /f

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

 taskkill -pid 431 /f

10
netstat -ano | знайти "номер вашого порту" Використовуйте це в Windows для конкретного порту.
BlondCode

Для мене (за допомогою Windows 10) findне працювало, але все ж findstrтаки було. Щоб уникнути помилкових позитивних результатів, це також допомагає передбачити двокрапку, наприклад netstat -ano | findstr :8080. Зробивши це - скажімо, він повернув PID 1234 - якщо ви хочете шукати назву цього процесу, це можна зробити через tasklist /fi "pid eq 1234".
Стів Чемберс

34

У Mac:

Термінал процесу вбивства :kill <pid>

Знайти під: Термінал:lsof -i:<port>

Відповідь Дієго Піно


11
kill <pid> не працював на mac, kill -9 <PID> працював зі мною
Samy Omar

33

У Ubuntu / Unix ми можемо вирішити цю проблему за 2 етапи, як описано нижче.

  1. Тип netstat -plten |grep java

    Це дасть вихід, подібний до:

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

    Ось 8080номер порту, на якому слухає процес java, і 9488його ідентифікатор процесу (pid).

  2. Щоб звільнити окупований порт, ми повинні вбити цей процес за допомогою killкоманди.

    kill -9 9488

    9488- ідентифікатор процесу від попереднього. Ми використовуємо, -9щоб змусити зупинити процес.

Ваш порт тепер повинен бути вільним, і ви можете перезапустити сервер.


Я налаштовую сервер CentOs в цифровому океані. Якщо я вбиваю цей процес, як я можу запустити сервер знову?
Авіджіт Баруа

Використовуйте лише -9, якщо це ваша власна програма, і ви не маєте втрачених даних. Це нечисто вбиває процес, -15 повідомляє програмі вийти з себе.
xuiqzy

27

(Тільки для Windows)

Для вбивства процесу спочатку потрібно знайти ідентифікатор процесу (pid)

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

netstat -ano | findstr :yourPortNumber

Як показано на малюнку нижче

Ви отримаєте свій ідентифікатор процесу (PID). Тепер, щоб вбити той самий процес, запустіть цю команду:

taskkill /pid yourid /f

введіть тут опис зображення


7

У вас є інший процес, що працює на тому ж порту.

Ви можете спробувати вбити одну з служб java.exe, що працює у вашому диспетчері завдань - ps переконайтеся, що ви не вбиваєте затемнення, оскільки це також зазначено як java.exe. Якщо нічого іншого не працює, перезавантаження машини все одно виправить. Схоже, ви не вимикаєте розетку з попереднього тесту. Сподіваюся, це допомагає.


6

Для тих, хто шукає найпростіші відповіді (адже це те, що ми зазвичай сумуємо), просто зупиніть свій запущений проект і почніть його заново. Більшу частину часу, що ми робимо, ми забуваємо зупинити проект, який ми запускали раніше, і коли ми повторно запускаємо проект, це виявляє таку проблему.

Я також додаю фотографію, щоб зробити її більш зрозумілою (я використовую "Весняний набір інструментів"). Отже, що вам потрібно зробити, це або натиснути кнопку в крайньому правому куті, якщо ви хочете відновити той самий проект, або спочатку натисніть кнопку, яка 2-го праворуч, щоб зупинити проект, а потім кнопку в крайньому лівому куті, щоб запустити ваш проект. Я сподіваюся, що це вирішить проблему небагатьох нових програмістів. :)

введіть тут опис зображення


4

У рядку CMD Windows знайдіть ідентифікатор процесу, який підтримує з'єднання на порту прив’язки, ввівши наступну команду:

C:> netstat -a -o

-показувати всі з'єднання

-показувати ідентифікатор процесу

А потім припиніть процес.


2

Так, як сказав Гвідо Сімоне, тому що інший процес прослуховування того ж порту. Якщо ви перебуваєте в 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 та спробуйте ще раз. Дивовижне затемнення не виявило помилки на той час. Я запустив свою програму ідеально.

Сподіваюся, мій досвід допоможе комусь.



1

Порт вже використовується деяким іншим процесом, як @Diego Піно сказав, що ви можете використовувати lsof на unix, щоб знайти процес і вбити відповідний, якщо ви знаходитесь у Windows, використовуйте netstat -ano, щоб отримати всі підписи процесу і порти, які кожен придбає. шукати потрібний порт і вбивати.

бути дуже просто, перезавантажте машину, якщо це можливо :)


1

Перезавантажте ПК один раз, я думаю, він буде працювати. Це почало працювати в моєму випадку. Ще одне, що можна зробити, - перейти до диспетчера завдань і закінчити процес.

Знімок екрана для довідки.


Будь ласка, не відповідайте на коментар / питання. Краще, якщо ви видалите це.
Clijsters

1

У моєму випадку Томкат працював у фоновому режимі. Я встановив його як зовнішній сервлет під час використання Eclipse. З Spring Boot в Intellij у нього є власний сервер, але він не може запускатися, поки він уже зайнятий.
У моєму випадку Tomcat запускається автоматично, я включаю ОС, тому мені потрібно вимкнути його вручну:

$ sudo service tomcat stop

Звичайно, "tomcat" залежить від того, яку версію tomcat ви використовуєте.
Сподіваюся, це може комусь допомогти.


0

Я зіткнувся з подібною проблемою в Eclipse, коли було відкрито дві консолі, коли я запустив спершу програму Server, а потім програму Client. Я зупиняв програму в одній консолі, думаючи, що вона закрила сервер, але вона закрила лише клієнт, а не сервер. Я знайшов запущені процеси Java у своєму менеджері завдань. Цю проблему було вирішено, закривши як серверні, так і клієнтські програми з окремих консолей (Eclipse показує консоль останньої активної програми). Тому коли я знову запустив програму Сервер, порт знову відкрився для захоплення.


0

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

Якщо ви не знаєте свого порту, двічі клацніть на сервері, який не запускається, і натисніть на Відкрити сторінку з властивостями сервера та клацніть по скляній рибці з лівого стовпця. Тут ви знайдете порти.


0

(1) перевірити, чи використовується порт чи ні, вбити цей процес

$ lsof -i: [порт]

(2) Ще одна причина - порт використовується ipv6, рішення:

редагувати /etc/sysctl.conf

додайте це у файл

net.ipv6.conf.all.disable_ipv6 = 1

потім зробіть ефект

$ sudo sysctl -p /etc/sysctl.conf

або просто перезавантажити


0

Це означає, що якийсь інший процес вже використовує порт. У випадку, якщо цей порт використовується іншими критичними програмами, і ви не хочете закривати цю програму, кращим способом є вибір будь-якого іншого порту, який вільний для використання.

Налаштуйте свою програму на будь-який інший безкоштовний порт, і ви побачите, що ваша програма працює.


0

Для вікон :

  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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.