Come posso risolvere l'errore "java.net.BindException: indirizzo già in uso: JVM_Bind"?


187

In Eclipse, ho ricevuto questo errore:

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

Non sono sicuro del perché sia ​​arrivato adesso, ma è andato bene solo poche ore fa. Devo riavviare la mia macchina? Come arrivo in fondo? Apprezzo qualsiasi consiglio o consiglio.


1
L'ho visto spesso su macchine di sviluppo quando si eseguono prove di codice - Come si può evitare il problema?
sarà

Risposte:


141

Sì, hai un altro processo associato alla stessa porta.

TCPView (solo Windows) da Windows Sysinternals è la mia app preferita ogni volta che si verifica un errore JVM_BIND. Mostra quali processi sono in ascolto su quale porta. Fornisce inoltre un comodo menu di scelta rapida per interrompere il processo o chiudere la connessione che si frappone.


una rapida soluzione: apri la vista del server> fai doppio clic sul server> modifica i numeri di porta utilizzati (ad es. per Tomcat admin, HTTP / 1.1 e AJP / 1.3)
Adrien Be

2
@novice_developer netstatè il comando che stai cercando, con le opzioni -a e -p, man netstatè tuo amico per tutto il resto :)
sox con Monica il

1
Se il processo sopra descritto non funziona, riavvia il PC una volta, penso che funzionerà. Ha iniziato a funzionare nel mio caso.
Kumar,

195

Se si conosce quale porta il processo è in esecuzione è possibile digitare: lsof -i:<port>.

Ad esempio, lsof -i:8080per elencare il processo (pid) in esecuzione sulla porta 8080.

Quindi uccidi il processo con kill <pid>


4
Sì, quello è Linux. Quindi prova qualcosa di equivalente in Windows. Forse questo può essere d'aiuto: stackoverflow.com/questions/15708/lsof-equivalent-for-windows
Diego Pino,

1
quindi sto usando Raspbian e dice: bash: lsof: comando non trovato. eventuali suggerimenti?
Mona Jalal,

1
@MonaJalal hmmm non sono sicuro, ma forse prova qualcosa del generesudo apt-get install lsof
Caffè

@DiegoPino Sto riscontrando lo stesso errore che java.net.BindException: Address already in use (Bind failed) ho usato lsof -i:8080e ottenuto tcp6 0 0 :::8080 :::* LISTEN 106872/java. Cosa dovrei fare ? Uccidi java ??
Avijit Barua,

@AvijitBarua L'ID processo (pid) del programma java associato a questa porta è 106872. Ogni programma Java che si avvia si presenta come programma java (è la macchina virtuale Java che esegue il codice compilato). Quindi sì, potresti uscire o uccidere questo programma java, se non è uno strumento critico (di sistema), ma il tuo programma; dai un'occhiata a un task manager come htop. Forse provi a collegarti a una porta utilizzata da un programma valido che non dovrebbe essere ucciso.
xuiqzy,

114

In windows

netstat -ano

elencherà tutti i protocolli, le porte e i processi in ascolto. Uso

taskkill -pid "proces to kill" /f

per terminare il processo ascoltando la porta. per esempio

 taskkill -pid 431 /f

10
netstat -ano | trova "numero della tua porta" Utilizzalo su Windows per una porta specifica.
BlondCode,

Per me (usando Windows 10) findnon ha funzionato ma findstrha funzionato. Per evitare falsi positivi aiuta anche a anteporre i due punti, ad es netstat -ano | findstr :8080. Dopo aver fatto questo - diciamo che ha restituito un PID di 1234 - se poi vuoi cercare il nome di questo processo questo può essere fatto tramite tasklist /fi "pid eq 1234".
Steve Chambers

34

Nel Mac:

Terminare il processo di uccisione :kill <pid>

Trova pid: Terminale:lsof -i:<port>

Da parte di Diego Pino


11
kill <pid> non ha funzionato su mac, kill -9 <PID> ha funzionato con me
Samy Omar

33

In Ubuntu / Unix possiamo risolvere questo problema in 2 passaggi come descritto di seguito.

  1. genere netstat -plten |grep java

    Questo darà un output simile a:

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

    Ecco 8080il numero di porta su cui è in ascolto il processo Java ed 9488è il suo ID di processo (pid).

  2. Per liberare la porta occupata, dobbiamo terminare questo processo usando il killcomando.

    kill -9 9488

    9488è l'id del processo precedente. Usiamo -9per forzare fermare il processo.

La tua porta ora dovrebbe essere libera e puoi riavviare il server.


Sto configurando il server CentOs in digital ocean. Se interrompo questo processo, come posso eseguire nuovamente il server?
Avijit Barua,

Usa -9 solo se è il tuo programma e non hai nessun dato da perdere lì. Uccide in modo impuro il processo, -15 dice al programma di uscire da solo.
xuiqzy,

27

(Solo Windows)

Per terminare un processo devi prima trovare l'ID processo (pid)

Eseguendo il comando:

netstat -ano | findstr :yourPortNumber

Come mostrato nella figura sotto

Otterrai il tuo ID processo (PID), ora per terminare lo stesso processo esegui questo comando:

taskkill /pid yourid /f

inserisci qui la descrizione dell'immagine


7

Hai un altro processo in esecuzione sulla stessa porta.

Potresti provare a uccidere uno dei servizi java.exe in esecuzione nel tuo task manager - ps assicurati di non uccidere eclipse poiché è elencato anche come java.exe. Se non funziona nient'altro, il riavvio del computer lo risolverà comunque. Sembra che tu non stia spegnendo una presa di un test precedente. Spero che questo ti aiuti.


6

Per coloro che sono alla ricerca della risposta più semplice (poiché è quello che di solito ci manca), basta interrompere il progetto in esecuzione e ricominciare. Il più delle volte ciò che facciamo è dimenticare di interrompere il progetto che abbiamo eseguito in precedenza e quando ri-eseguiamo il progetto mostra un tale problema.

Inoltre allego una foto per renderla più chiara (utilizzo 'Spring tool suite'). Quindi quello che devi fare è o fare clic sul pulsante all'estrema destra, se vuoi riavviare lo stesso progetto o prima fare clic sul pulsante che è il 2 ° da destra per interrompere il progetto e quindi il pulsante all'estrema sinistra per eseguire il tuo progetto. Spero che questo risolva il problema di alcuni dei programmatori più recenti. :)

inserisci qui la descrizione dell'immagine


4

Nella riga CMD di Windows, individuare l'ID processo che contiene una connessione sulla porta di associazione immettendo il comando seguente:

C:> netstat -a -o

-a mostra tutte le connessioni

-o mostra identificativo del processo

E quindi termina il processo.


2

Sì, come diceva Guido Simone perché un altro processo ascoltava la stessa porta. Se sei in Ubuntu puoi semplicemente uccidere quel processo dando il comando sudo kill $(sudo lsof -t -i:[port number])

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

Ma una volta non ha funzionato per me. ho dato il comando

$ lsof -i:[port] 

e non mostra nulla.

Ho controllato i contenitori della mia finestra mobile usando il comando docker ps -ama non sono vivi. Tutti i contenitori si sono arrestati (ma ricordo, ho fermato un contenitore che è stato utilizzato la stessa porta pochi minuti fa). Per assicurarsi che la finestra mobile non sia la ragione, mi fermo tutto processo docker utilizzando il comando sudo service docker stope riprovare. Sorprendentemente l'eclissi non ha mostrato l'errore in quel momento, ma ha eseguito perfettamente il mio programma.

Spero che la mia esperienza possa aiutare qualcuno.



1

La porta è già utilizzata da qualche altro processo poiché @Diego Pino ha detto che puoi usare lsof su unix per localizzare il processo e uccidere il rispettivo, se sei su Windows usa netstat -ano per ottenere tutti i pid del processo e il porte che tutti acquisiscono. cerca la tua porta prevista e uccidi.

per essere molto semplice basta riavviare il computer, se possibile :)


1

Riavvia il PC una volta, penso che funzionerà. Ha iniziato a funzionare nel mio caso. Un'altra cosa può essere fatta andare su Task Manager e terminare il processo.

Schermata per il riferimento.


Si prega di non rispondere con un commento / domanda. Sarebbe preferibile se lo cancellassi.
Clijsters,

1

Nel mio caso Tomcat era in esecuzione in background. L'ho installato come servlet esterno durante l'utilizzo di Eclipse. Con un avvio a molla in Intellij ha un proprio server ma non può essere avviato mentre è già occupato.
Nel mio caso Tomcat si avvia automaticamente, accendo il mio sistema operativo, ecco perché devo spegnerlo manualmente:

$ sudo service tomcat stop

ovviamente "tomcat" dipende dalla versione di tomcat in uso.
Spero che possa aiutare qualcuno.


0

Ho riscontrato un problema simile in Eclipse quando sono state aperte due console quando ho avviato prima il programma Server e poi il programma Client. Ero solito interrompere il programma nella singola console pensando che avesse chiuso il server, ma aveva chiuso solo il client e non il server. Ho trovato i processi Java in esecuzione nel mio Task manager. Questo problema è stato risolto chiudendo i programmi Server e Client dalle loro singole console (Eclipse mostra la console dell'ultimo programma attivo). Quindi, quando ho riavviato il programma Server, la porta era di nuovo aperta per essere catturata.


0

La tua porta deve essere occupata in qualche altro processo. Quindi puoi scaricare TCPView su https://technet.microsoft.com/en-us/sysinternals/bb897437 e il processo per la porta utilizzata.

Se non conosci la tua porta, fai doppio clic sul server che non si avvia e fai clic su Apri pagina Proprietà server e fai clic su glassfish dalla colonna di sinistra. Troverai i porti qui.


0

(1) controlla che la porta sia in uso o meno, termina quel processo

$ lsof -i: [port]

(2) un altro motivo è che la porta è utilizzata da ipv6, soluzione:

modifica /etc/sysctl.conf

aggiungi questo al file

net.ipv6.conf.all.disable_ipv6 = 1

quindi rendilo efficace

$ sudo sysctl -p /etc/sysctl.conf

o semplicemente riavviare


0

Significa che qualche altro processo sta già utilizzando la porta. Nel caso in cui questa porta sia utilizzata da alcune altre applicazioni critiche e non si desideri chiudere tale applicazione, il modo migliore è scegliere qualsiasi altra porta che è libera di usare.

Configura l'applicazione per utilizzare qualsiasi altra porta che è gratuita e vedrai l'applicazione funzionare.


0

Per windows :

  1. Trova l'ID del processo

    netstat -nao | trova "8080"

Ti mostrerà l'ID del processo come numero.

Esempio :

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       18856

Qui 18856 è l'ID del processo

  1. Uccidi quel processo

    taskkill / PID 18856 / F

Produzione : SUCCESSO: il processo con PID 18856 è stato terminato.

Qui usando taskkill stai uccidendo l'ID processo: 18856

Per Linux / Mac :

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

Qui trovi il processo che lo usa sudo lsof -t -i:8080e lo uccide con il comando sudo kill

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.