- Как устранить ошибку» java.net.BindException: Address already in use: JVM Bind»?
- 16 ответов:
- Java.net.BindException: Address already in use: JVM_Bind:8080 Solution
- How to deal with java.net.BindException: Address already in use: JVM_Bind:8080
- 1. Address already in use: JVM_Bind:8080
- Find process which is listening on port 8080 in Linux
- How to solve «java.net.BindException: Address already in use»
- 7 comments :
- Проблема с портом ServerSocket (java.net.BindException: адрес уже используется: JVM_Bind)
- Проблема с портом ServerSocket (java.net.BindException: адрес уже используется: JVM_Bind)
- «Address Already in Use» или как избежать проблем при завершении TCP соединения
- Способы избежания проблем
Как устранить ошибку» java.net.BindException: Address already in use: JVM Bind»?
в Eclipse, я получил эту ошибку:
Я не уверен, почему он появился сейчас, но он работал нормально всего несколько часов назад. Мне нужно перезагрузить компьютер? Как мне докопаться до сути? Я ценю любые советы или рекомендации.
16 ответов:
Да у вас есть другой процесс, привязанный к тому же порту.
TCPView (только для Windows) с Windows Sysinternals это мое любимое приложение, когда у меня есть ошибка JVM_BIND. Он показывает, какие процессы прослушивают какой порт. Он также предоставляет удобное контекстное меню, чтобы либо убить процесс, либо закрыть соединение, которое мешает.
Если вы знаете, что порт работает процесс, вы можете ввести: lsof -i:
например, lsof -i:8080 , чтобы вывести список процессов (pid), запущенных на порту 8080.
затем убить процесс с kill
перечислит все протоколы, порты и процессы прослушивания . Используйте
убить процесс прослушивания порта. е.г
убить процесс Терминал: kill
найти pid: Терминал: lsof -i:
от Диего Пино ответ
на Ubuntu / Unix мы можем решить эту проблему, выполнив 2 действия, как описано ниже.
это даст выход, как это
здесь порт нет 8080 на котором запущен процесс java. И его идентификатор процесса (pid) составляет 9488 перед java ( 9488/java ).
kill -9 9488
здесь: -9 для принудительной остановки и 9488 — это идентификатор процесса.
теперь снова запустите сервер.Надеюсь, этот ответ будет полезен для вас, ребята.
У вас есть другой процесс, работающий на том же порту.
вы можете попробовать убить одного из java.exe-службы, работающие в вашем диспетчере задач — ps убедитесь, что вы не убиваете eclipse, так как это указано как java.а также exe. Если ничего больше не работает, перезагрузка компьютера будет исправить это в любом случае. Похоже, вы не выключаете сокет из предыдущего теста. Надеюсь, это поможет.
чтобы убить процесс, вам сначала нужно найти идентификатор процесса (pid)
вы получите свой идентификатор процесса (PID), теперь, чтобы убить тот же процесс, выполните эту команду:
в строке CMD Windows найдите идентификатор процесса, который содержит соединение на порту привязки, введя следующую команду:
— a показать все соединения
-o показывает идентификатор процесса
а то завершить процесс.
для тех, кто ищет самый простой из ответов (как это то, что мы обычно пропускаем), просто остановите свой запущенный проект и запустите его снова. В большинстве случаев мы забываем остановить проект, который мы запускали ранее, и когда мы повторно запускаем проект, он показывает такую проблему.
Я также прикрепляю фотографию, чтобы сделать ее более четкой (я использую «Spring tool suite»). Итак, что вам нужно сделать, это либо нажать кнопку в крайнем правом углу, если вы хотите перезапустить тот же проект или сначала нажмите на кнопку, которая является 2-й справа, чтобы остановить ваш проект, а затем кнопку в крайнем левом углу, чтобы запустить свой проект. Я надеюсь, что это решит проблему нескольких новых программистов. 🙂
да, как сказал Гвидо Симоне, потому что другой процесс прослушивает тот же порт.Если вы находитесь в Ubuntu, вы можете просто убить этот процесс, давая команду sudo kill $(sudo lsof -t -i:[port number])
пример: sudo kill $(sudo lsof -t -i:8080)
но однажды это не сработало для меня. я дал команду
и это ничего не показывает.
Я проверил мои контейнеры docker с помощью команды docker ps -a но ни один из них не жив.Все контейнеры остановились (но я помню, я остановил один контейнер, который был использован же порт несколько минут назад.). чтобы убедиться, что docker не является причиной, я останавливаю весь процесс docker с помощью команды sudo service docker stop и попробуйте снова. Удивительно, но eclipse не показал ошибку в то время.он отлично запускал мою программу.
надеюсь, что мой опыт поможет кому-то одному.
порт уже используется каким-то другим процессом, поскольку @Diego Pino сказал, что u может использовать lsof в unix для поиска процесса и убить соответствующий, если вы находитесь в windows, используйте netstat-ano, чтобы получить все pids процесса и порты, которые каждый приобретает. найдите нужный порт и убейте.
чтобы быть очень легко просто перезагрузить машину, если это возможно 🙂
перезагрузите компьютер один раз, я думаю, что это будет работать. Это начало работать в моем случае. Еще одна вещь, которую можно сделать, перейдите в Диспетчер задач и завершите процесс.
Я столкнулся с подобной проблемой в Eclipse, когда были открыты две консоли, когда я сначала запустил серверную программу, а затем клиентскую программу. Я останавливал программу в одной консоли, думая, что она закрыла сервер, но она закрыла только клиент, а не сервер. Я нашел запущенные процессы Java в моем диспетчере задач. Эта проблема была решена путем закрытия как серверных, так и клиентских программ с их отдельных консолей(Eclipse показывает консоль последней активной программы). Так что когда я снова запустил серверную программу, порт снова был открыт для захвата.
ваш порт должен быть занят в другом процессе. Таким образом, Вы можете скачать TCPView на https://technet.microsoft.com/en-us/sysinternals/bb897437 и убить процесс для используемого порта.
Если вы не знаете свой порт, дважды щелкните на сервере, который не запускается и нажмите на странице открыть Свойства сервера и нажмите на glassfish из левой колонки. Здесь вы найдете порты.
(1) Проверьте порт используется или нет, убить этот процесс
$ lsof-i: [port]
(2) Еще одна причина заключается в том, что порт используется ipv6, решение:
edit / etc / sysctl.conf
добавьте это в файл
net.протокол IPv6.конф.все.disable_ipv6 = 1
тогда сделайте это эффект
$ sudo sysctl-p /etc/sysctl.conf
или просто перезагрузка
Это означает, что другой процесс уже использует порт. В случае, если этот порт используется некоторыми другими критическими приложениями, и вы не хотите закрывать это приложение, лучший способ-выбрать любой другой порт, который можно использовать бесплатно.
настройте приложение для использования любого другого свободного порта, и вы увидите, что ваше приложение работает.
Источник
Java.net.BindException: Address already in use: JVM_Bind:8080 Solution
How to deal with java.net.BindException: Address already in use: JVM_Bind:8080
1. Address already in use: JVM_Bind:8080
Find process which is listening on port 8080 in Linux
netstat -nap | grep 8080
How to solve «java.net.BindException: Address already in use»
7 comments :
Hello there, I am getting below exception, do you know what causing it :
Caused by: java.rmi.server.ExportException: Port already in use: 23602; nested exception is:
java.net.BindException: Address already in use
at sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:310)
at sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:218)
July 10, 2013 at 9:40 PM Anonymous said.
INFO 2013-07-17 12:26:44,447 [main] com.mulesoft.habitat.agent.AnypointAgentUtils: Anypoint Service Registry Agent is DISABLED. Property anypoint.agent.token is missing or empty.
Exception in thread «Thread-0» java.lang.RuntimeException: Cannot open port 6666
at com.mulesoft.mule.debugger.remote.RemoteDebuggerServer.createServerSocket(RemoteDebuggerServer.java:83)
at com.mulesoft.mule.debugger.remote.RemoteDebuggerServer.run(RemoteDebuggerServer.java:33)
Caused by: java.net.BindException: Address already in use: JVM_Bind
at java.net.DualStackPlainSocketImpl.bind0(Native Method)
at java.net.DualStackPlainSocketImpl.socketBind(Unknown Source)
at java.net.AbstractPlainSocketImpl.bind(Unknown Source)
at java.net.PlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
at java.net.ServerSocket.(Unknown Source)
at java.net.ServerSocket.(Unknown Source)
at com.mulesoft.mule.debugger.remote.RemoteDebuggerServer.createServerSocket(RemoteDebuggerServer.java:81)
. 1 more
July 17, 2013 at 10:35 AM Anonymous said.
Very useful information.Thanks a lot
August 23, 2013 at 4:41 AM Anonymous said.
Hello, I am getting Exception in thread «main» java.net.BindException: Address already in use: JVM_Bind, while running my server. I checked its not running already, but I am still getting this error, does Java keeps the port even after process is killed ?
Exception in thread «main» java.net.BindException: Address already in use: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.socketBind(Unknown Source)
at java.net.PlainSocketImpl.bind(Unknown Source
April 10, 2015 at 3:04 AM Anonymous said.
Thanks for the post, that was really helpful.
To kill the port use
Windows
REM find the pid
netstat -a -o -n
taskkill /F /PID
Linux
fuser -k 8080/tcp
or
netstat -anp tcp | grep 8080
kill -9 PID
or
lsof -i tcp:8080
kill -9 PID
@Anonymous, thanks for sharing commands to find the kill a process using a certain port, which is also key to solve this error.
October 30, 2015 at 9:51 PM Rajkumar said.
First time it won’t show any error.For the second time executing the same program, you have to close the first one which is running using the same port number.
in eclipse and netBeans IDE you can find the option called close in the right bottom corner.
It worked for me..Hope it will work for you too.
Источник
Проблема с портом ServerSocket (java.net.BindException: адрес уже используется: JVM_Bind)
Я создаю простую клиент-серверную программу на Java с помощью Sockets. Я следил за несколькими учебными пособиями по созданию простой клиент-серверной программы, которая получила меня так далеко, но когда я пытаюсь запустить свой класс сервера, он либо зависает, когда я набираю определенные порты и ничего не делаю, или с некоторыми другими портами дает мне исключение “java.net.BindException: Адрес уже используется: JVM_Bind”.
Вот некоторые из ключевых частей моего класса сервера;
Как я уже сказал, я следил за учебниками, и нет никакой разницы между тем, что я сделал по сравнению с ними, но у меня возникают проблемы, и мой сервер просто ничего не делает и замораживает, или дает это исключение.
Я немного изменил свой код и, похоже, устранил проблему. Основное исправление заключалось в установке сервера в конструкторе, который, похоже, исправил его. Хотя, я до сих пор не понимаю, почему так, как я делал это раньше, не работал. Но теперь это работает.
происходит, когда вы пытаетесь запустить свою программу, используя номер порта, который уже используется, либо другими программами в вашей системе, либо другими экземплярами вашей программы, которые “зависают”.
как для замораживания,
будет ждать, пока клиент не свяжет соединение с этим сокетом. Без другой программы, работающей как клиент, этот “замерзнет”, ожидая ее.
Вышеуказанная ошибка возникает только тогда, когда сервер /Tomcat использует тот же порт.
На Mac, пожалуйста, используйте следующие команды:
Первый (lsof -i: 8082) перечислит процесс, запущенный на этом порту. И второй (kill 45270) убьет процесс, и порт будет свободен. После перезапуска Tomcat или любого другого процесса, который использовал этот порт, он будет работать.
Источник
Проблема с портом ServerSocket (java.net.BindException: адрес уже используется: JVM_Bind)
Я создаю простую клиент-серверную программу на Java с помощью Sockets. Я следил за несколькими учебными пособиями по созданию простой клиент-серверной программы, которая получила меня так далеко, но когда я пытаюсь запустить свой класс сервера, он либо зависает, когда я набираю определенные порты и ничего не делаю, или с некоторыми другими портами дает мне исключение “java.net.BindException: Адрес уже используется: JVM_Bind”.
Вот некоторые из ключевых частей моего класса сервера;
Как я уже сказал, я следил за учебниками, и нет никакой разницы между тем, что я сделал по сравнению с ними, но у меня возникают проблемы, и мой сервер просто ничего не делает и замораживает, или дает это исключение.
Я немного изменил свой код и, похоже, устранил проблему. Основное исправление заключалось в установке сервера в конструкторе, который, похоже, исправил его. Хотя, я до сих пор не понимаю, почему так, как я делал это раньше, не работал. Но теперь это работает.
происходит, когда вы пытаетесь запустить свою программу, используя номер порта, который уже используется, либо другими программами в вашей системе, либо другими экземплярами вашей программы, которые “зависают”.
как для замораживания,
будет ждать, пока клиент не свяжет соединение с этим сокетом. Без другой программы, работающей как клиент, этот “замерзнет”, ожидая ее.
Вышеуказанная ошибка возникает только тогда, когда сервер /Tomcat использует тот же порт.
На Mac, пожалуйста, используйте следующие команды:
Первый (lsof -i: 8082) перечислит процесс, запущенный на этом порту. И второй (kill 45270) убьет процесс, и порт будет свободен. После перезапуска Tomcat или любого другого процесса, который использовал этот порт, он будет работать.
Источник
«Address Already in Use» или как избежать проблем при завершении TCP соединения
Корректное отключение
Для корректного завершения сетевого подключения обе стороны должны послать пакеты с сигналом о завершении (FIN), которые указывают что стороны не будут больше отсылать данные, также каждая сторона должна подтвердить (ACK) получение сигнала о завершении сетевого обмена данными. FIN инициируется когда приложение вызывает метод close(), shutdown() или exit(). После завершения работы метода close() ядро переходит в режим ожидания подтверждения от второй стороны приема сигнала о завершении. Это делает возможной ситуацию когда процесс инициировавший отключение будет завершен прежде чем ядро освободит рессурсы связанные с подключением, и снова разрешит использовать порт для связывания с другим процесоом (в этом случае, при попытке использования порта мы получим исключение AddressAlreadyInUse).
На изображении:
- Имеется установленное соединение, состояние ESTABLISHED
- Клиент инициирует окончание подключения, посылает серверу сигнал о завершении подключения (FIN), переходит в состояние ожидания ответа сервера (FIN_WAIT_1)
- Сервер получает сигнал о завершении подключения и отправляет подтверждение (ACK), переходит в состояние ожидания завершения подключения (CLOSE_WAIT) (вызывает close())
- Сервер отсылает клиенту сигнал о том что успешно закрыл подключение (FIN) и пробует прочитать подтверждение клиента (ACK), после чего не дожидаясь его отключается.
- Теперь клиенту может придти два сигнала в разной очередности
ACK — клиент получил подтверждение о том что сервер понял его намерение закрыть подключение
- Клиент переходит в состояние ожидания сигнала об окончании закрытия подключения (FIN) от сервера (FIN_WAIT_2)
- Клиент получает сигнал о закрытии подключения сервером (FIN), отправляет подтверждение (ACK), некоторое время ждет(TIME_WAIT) и отключается (ядро освобождает рессурсы) (CLOSED)
FIN — клиент получает сигнал о закрытии подключения на стороне сервера(FIN), раньше чем подтверждение от сервера (ACK), о получении инициирующего сигнала о закрытии от клиента (FIN)
- Клиент отправляет подтверждение приема сигнала о том что сервер закрывает соединение, и переходит в состояние отключения (CLOSING)
- После отключения пробует считать сигнал подтверждения от сервера (который был отправлен сервером сразу после получения от клиента сигнала о завершении работы, пункт 2), некоторое время ожидает(TIME_WAIT) и ядро освобождает рессурсы (CLOSING).
На рисунке показаны все воможные состояния, которые могут быть во время корректного завершения, в зависимости от порядка получения пакетов FIN и ACK от удаленной стороны. Обратите внимание, если вы инициировали завершение подключения (левая половина рисунка), то другая сторона не будет ожидать подтверждения получения вами пакета FIN (правая половина рисунка). Сотояние TIME_WAIT требуется на случай если подтверждение (ACK) которое вы отправили не было получено на другой стороне, или на случай появления ложных пакетов по какой-то причине. Я не знаю почему на стороне сервера не сделали состояние TIME_WAIT, хотя если клиент инициирует закрытие, это безусловно и не должно требовать ожидания. Состояние TIME_WAIT может удерживать порт в течение нескольких минут после завершения процесса. Время удержания варьируется в зависимости от операционной системы, в некоторых операционных системах оно является динамическим, стандартные значения лежат в диапазоне от 1 до 4 минут.
Если обе стороны успеют инициировать сигнал завершения, раньше чем получат его от другой стороны, то обе стороны будут вынуждены пройти через ожидание (TIME_WAIT).
Корректное отключение слушающей стороны
Слушающий сокет может быть закрыт немедленно, при отсутствии входящих подключений, его состояние переходит сразу в CLOSED. При наличии входящих подключений, будет произведен переход к FIN_WAIT_1 и затем к TIME_WAIT.
Обратите внимание, на стороне слушающего сокета невозможно гарантировать чистое закрытие. Пока вы проверяете использование соединения методом select() до закрытия, существует крошечная, но реальная возможность появления входящего подключения после вызова select() и до вызова close().
Непредвиденное отключение удаленной стороны
При внезапном отключении сервера, локальная сторона инициирует закрытие соединения, и в этом случае TIME_WAIT неизбежен. Если удаленная сторона исчезает из-за сбоя сети или перезагрузки машины (редкие случаи), локальный порт будет оставаться привязанным вплоть до истечения таймаута состояния TIME_WAIT. Хуже того, некоторые старые операционные системы, не реализуют таймаут для состояния FIN_WAIT_2, и могут оставаться в нем бесконечно долго, в этом случае спасти может только перезагрузка системы.
Если же локальное приложение (клиент) падает в процессе активного соединения, порт будет занят пока не завершится состояние TIME_WAIT, то же верно для приложений, закрытых в процессе подключения к удаленной стороне(pending).
Способы избежания проблем
Опция SO_REUSEADDR
Можно использовать метод setsockopt(), для установки опции SO_REUSEADDR, что позволит создавать привязку к порту даже если он еще находится в состоянии TIME_WAIT (привязка к порту будет разрешена только для одного процесса). Это самый простой и эффективный метод избежать сообщения «address already in use».
Но, как ни странно, использование опции SO_REUSEADDR, может привести к более трудноотлавливаемым ошибкам чем «address already in use». SO_REUSEADDR позволяет использовать порт застрявший в TIME_WAIT, но вы все еще сможете использовать этот порт в том процессе, в котором он привязан изначально.
Источник