¿Cómo resuelvo el error "java.net.BindException: dirección ya en uso: JVM_Bind"?

187

En Eclipse, recibí este error:

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

No estoy seguro de por qué surgió ahora, pero funcionó bien hace solo unas horas. ¿Necesito reiniciar mi máquina? ¿Cómo llego al fondo? Agradezco cualquier consejo o consejo.

café
fuente
1
He visto esto a menudo en máquinas de desarrollo cuando ejecuta pruebas de código: ¿cómo se puede evitar el problema?
será

Respuestas:

141

Sí, tiene otro proceso vinculado al mismo puerto.

TCPView (solo Windows) de Windows Sysinternals es mi aplicación favorita cada vez que tengo un error JVM_BIND. Muestra qué procesos están escuchando en qué puerto. También proporciona un menú contextual conveniente para eliminar el proceso o cerrar la conexión que se interpone en el camino.

Guido Simone
fuente
una solución rápida: abra la vista del servidor> haga doble clic en el servidor> cambie los números de puerto utilizados (es decir, para Tomcat admin, HTTP / 1.1 y AJP / 1.3)
Adrien Be
2
@novice_developer netstates el comando que estás buscando, con las opciones -a y -p, man netstates tu amigo para todo lo demás :)
sox con Monica
1
Si el proceso anterior no funciona, reinicie la PC una vez, creo que funcionará. Comenzó a funcionar en mi caso.
Kumar
195

Si sabe en qué puerto se está ejecutando el proceso, puede escribir: lsof -i:<port> .

Por ejemplo, lsof -i:8080 para enumerar el proceso (pid) que se ejecuta en el puerto 8080.

Luego mata el proceso con kill <pid>

Diego Pino
fuente
44
Sí, eso es Linux. Luego intente algo equivalente en Windows. Quizás esto pueda ayudar: stackoverflow.com/questions/15708/lsof-equivalent-for-windows
Diego Pino
1
entonces estoy usando Raspbian y dice: bash: lsof: comando no encontrado. ¿alguna sugerencia?
Mona Jalal
1
@MonaJalal hmmm no estoy seguro, pero tal vez intente algo comosudo apt-get install lsof
Café
@DiegoPino Estoy enfrentando el mismo error java.net.BindException: Address already in use (Bind failed) que usé lsof -i:8080y obtuve tcp6 0 0 :::8080 :::* LISTEN 106872/java. Qué tengo que hacer ? Matar a Java?
Avijit Barua
@AvijitBarua El ID de proceso (pid) del programa Java vinculado a este puerto es 106872. Cada programa Java que ejecutas se presenta como el programa Java (es la máquina virtual Java que ejecuta tu código compilado). Entonces, sí, podría salir o eliminar este programa de Java, si no es una herramienta crítica (del sistema), sino su propio programa; echar un vistazo en un administrador de tareas como htop. Tal vez intente vincularse a un puerto utilizado por un programa válido que no debería eliminarse.
xuiqzy
114

En ventanas

netstat -ano

enumerará todos los protocolos, puertos y procesos de escucha. Utilizar

taskkill -pid "proces to kill" /f

para matar el proceso escuchando el puerto. p.ej

 taskkill -pid 431 /f
Abhi
fuente
10
netstat -ano | encuentre "número de su puerto" Use esto en Windows para un puerto específico.
BlondCode
Para mí (usando Windows 10) findno funcionó pero findstrsí. Para evitar falsos positivos también ayuda a anteponer un colon, por ejemplo netstat -ano | findstr :8080. Una vez hecho esto, digamos que devolvió un PID de 1234, si desea buscar el nombre de este proceso, puede hacerlo a través de tasklist /fi "pid eq 1234".
Steve Chambers
34

En Mac:

Terminal de proceso de muerte :kill <pid>

Encuentra pid: Terminal:lsof -i:<port>

De Diego Pino respuesta

Hoyin
fuente
11
kill <pid> no funcionó en mac, kill -9 <PID> trabajó conmigo
Samy Omar
33

En Ubuntu / Unix podemos resolver este problema en 2 pasos como se describe a continuación.

  1. Tipo netstat -plten |grep java

    Esto dará un resultado similar a:

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

    Aquí 8080está el número de puerto en el que el proceso de Java está escuchando y 9488es su id de proceso (pid).

  2. Para liberar el puerto ocupado, tenemos que matar este proceso usando el killcomando.

    kill -9 9488

    9488es la identificación del proceso de antes. Usamos -9para forzar la detención del proceso.

Su puerto ahora debería estar libre y puede reiniciar el servidor.

Bharti Rawat
fuente
Estoy configurando el servidor CentOs en el océano digital. Si elimino este proceso, ¿cómo puedo volver a ejecutar el servidor?
Avijit Barua
Solo use -9 si es su propio programa y no tiene ningún dato que perder allí. Elimina imprudentemente el proceso, -15 le dice al programa que salga solo.
xuiqzy
27

(Solo Windows)

Para matar un proceso, primero debe encontrar el Id. De proceso (pid)

Al ejecutar el comando:

netstat -ano | findstr :yourPortNumber

Como se muestra en la imagen a continuación

Obtendrá su Id. De proceso (PID). Ahora, para eliminar el mismo proceso, ejecute este comando:

taskkill /pid yourid /f

ingrese la descripción de la imagen aquí

Sufiyan Ansari
fuente
7

Tiene otro proceso ejecutándose en el mismo puerto.

Puede intentar matar uno de los servicios java.exe que se ejecutan en su administrador de tareas: ps asegúrese de no matar a eclipse, ya que también aparece como java.exe. Si nada más funciona, reiniciar su máquina lo arreglará de todos modos. Parece que no está apagando un socket de una prueba anterior. Espero que esto ayude.

javarebel
fuente
6

Para aquellos que buscan la respuesta más simple (ya que eso es lo que generalmente extrañamos), simplemente detenga su proyecto en ejecución y comience nuevamente. La mayoría de las veces lo que hacemos es olvidarnos de detener el proyecto que ejecutamos antes y cuando volvemos a ejecutar el proyecto, se muestra un problema.

También adjunto una foto para que quede más clara (uso 'Spring tool suite'). Entonces, lo que debe hacer es hacer clic en el botón en el extremo derecho, si desea reiniciar el mismo proyecto o primero en el botón que está en el segundo lugar desde la derecha para detener su proyecto y luego el botón en el extremo izquierdo para ejecutar tu proyecto. Espero que esto resuelva el problema de algunos de los programadores más nuevos. :)

ingrese la descripción de la imagen aquí

Me_developer
fuente
4

En la línea CMD de Windows, encuentre el ID de proceso que mantiene una conexión en el puerto de enlace ingresando el siguiente comando:

C:> netstat -a -o

-a mostrar todas las conexiones

-o mostrar identificador de proceso

Y luego terminar el proceso.

CharlesX
fuente
2

Sí, como dijo Guido Simone porque otro proceso está escuchando el mismo puerto. Si estás en Ubuntu, simplemente puedes matar ese proceso dando un comando sudo kill $(sudo lsof -t -i:[port number])

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

Pero una vez no funcionó para mí. di la orden

$ lsof -i:[port] 

Y no muestra nada.

docker ps -aRevisé mis contenedores de Docker usando el comando pero ninguno de ellos vivo. Todos los contenedores se han detenido (pero recuerdo, detuve un contenedor que se usó en el mismo puerto hace unos minutos). Para asegurarme de que Docker no sea la razón, dejo todo proceso de docker usando el comando sudo service docker stope intente nuevamente. Sorprendentemente, el eclipse no mostró el error en ese momento. Ejecuta mi programa perfectamente.

Espero que mi experiencia ayude a alguien.

Yasitha Bandara
fuente
2

Debe cerrar su puerto si es un usuario de Linux, luego escriba

fuser -k 8080/tcp
Machhindra Neupane
fuente
1

El puerto ya está siendo utilizado por algún otro proceso ya que @Diego Pino dijo que puedes usar lsof en Unix para localizar el proceso y eliminar el respectivo, si estás en Windows usa netstat -ano para obtener todos los pids del proceso y puertos que todos adquieren. busque su puerto previsto y mate.

para ser muy fácil, simplemente reinicie su máquina, si eso es posible :)

Akash Yadav
fuente
1

Reinicie la PC una vez, creo que funcionará. Comenzó a funcionar en mi caso. Una cosa más se puede hacer ir al Administrador de tareas y finalizar el proceso.

Captura de pantalla para la referencia.

Kumar
fuente
Por favor no responda con un comentario / pregunta. Sería preferible si eliminaras esto.
Clijsters
1

En mi caso, Tomcat se estaba ejecutando en segundo plano. Lo he instalado como un servlet externo mientras uso Eclipse. Con un Spring Boot en Intellij tiene su propio servidor pero no puede iniciarse mientras ya está ocupado.
En mi caso, Tomcat se inicia automáticamente, enciendo mi sistema operativo, es por eso que necesito apagarlo manualmente:

$ sudo service tomcat stop

por supuesto, "tomcat" depende de la versión de tomcat que esté utilizando.
Espero que pueda ayudar a alguien.

EnGoPy
fuente
0

Me enfrenté a un problema similar en Eclipse cuando se abrieron dos consolas cuando comencé primero el programa Servidor y luego el programa Cliente. Solía ​​detener el programa en la consola única pensando que había cerrado el servidor, pero solo había cerrado el cliente y no el servidor. Encontré procesos Java en ejecución en mi Administrador de tareas. Este problema se resolvió cerrando los programas Servidor y Cliente desde sus consolas individuales (Eclipse muestra la consola del último programa activo). Entonces, cuando volví a iniciar el programa Servidor, el puerto estaba nuevamente abierto para ser capturado.

Chetan Gowda
fuente
0

Su puerto debe estar ocupado en algún otro proceso. Para que pueda descargar TCPView en https://technet.microsoft.com/en-us/sysinternals/bb897437 y eliminar el proceso para el puerto usado.

Si no conoce su puerto, haga doble clic en el servidor que no se está iniciando y haga clic en Abrir página de propiedades del servidor y haga clic en glassfish desde la columna izquierda. Encontrarás los puertos aquí.

suketup
fuente
0

(1) verifique que el puerto esté en uso o no, elimine ese proceso

$ lsof -i: [puerto]

(2) otra razón es que el puerto es utilizado por ipv6, solución:

editar /etc/sysctl.conf

agregue esto al archivo

net.ipv6.conf.all.disable_ipv6 = 1

entonces hazlo efecto

$ sudo sysctl -p /etc/sysctl.conf

o simplemente reiniciar

tonysok
fuente
0

Significa que algún otro proceso ya está utilizando el puerto. En caso de que este puerto esté siendo utilizado por otras aplicaciones críticas y no desee cerrar esa aplicación, la mejor manera es elegir cualquier otro puerto que sea de uso gratuito.

Configure su aplicación para usar cualquier otro puerto que sea gratuito y verá que su aplicación funciona.

Rakesh Burbure
fuente
0

Para ventanas :

  1. Encuentra la identificación del proceso

    netstat -nao | encontrar "8080"

Le mostrará la ID del proceso como un número.

Ejemplo :

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       18856

Aquí 18856 es la identificación del proceso

  1. Mata ese proceso

    taskkill / PID 18856 / F

Salida : ÉXITO: ​​El proceso con PID 18856 ha finalizado.

Aquí, usando taskkill, está eliminando el ID del proceso: 18856

Para linux / Mac :

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

Aquí encontrarás el proceso usándolo sudo lsof -t -i:8080y eliminándolo mediante el comando sudo kill

MD Sajedul Karim
fuente