java.net.ConnectException: connessione rifiutata


186

Sto cercando di implementare una connessione TCP, tutto funziona bene dal lato server ma quando eseguo il programma client (dal computer client) ottengo il seguente errore:

java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
        at java.net.Socket.connect(Socket.java:529)
        at java.net.Socket.connect(Socket.java:478)
        at java.net.Socket.<init>(Socket.java:375)
        at java.net.Socket.<init>(Socket.java:189)
        at TCPClient.main(TCPClient.java:13)

Ho provato a cambiare il numero di socket nel caso fosse in uso ma senza risultati qualcuno sa cosa sta causando questo errore e come risolverlo.

Il codice del server:

//TCPServer.java

import java.io.*;
import java.net.*;

class TCPServer {
    public static void main(String argv[]) throws Exception {
        String fromclient;
        String toclient;

        ServerSocket Server = new ServerSocket(5000);

        System.out.println("TCPServer Waiting for client on port 5000");

        while (true) {
            Socket connected = Server.accept();
            System.out.println(" THE CLIENT" + " " + connected.getInetAddress()
                    + ":" + connected.getPort() + " IS CONNECTED ");

            BufferedReader inFromUser = new BufferedReader(
                    new InputStreamReader(System.in));

            BufferedReader inFromClient = new BufferedReader(
                    new InputStreamReader(connected.getInputStream()));

            PrintWriter outToClient = new PrintWriter(
                    connected.getOutputStream(), true);

            while (true) {

                System.out.println("SEND(Type Q or q to Quit):");
                toclient = inFromUser.readLine();

                if (toclient.equals("q") || toclient.equals("Q")) {
                    outToClient.println(toclient);
                    connected.close();
                    break;
                } else {
                    outToClient.println(toclient);
                }

                fromclient = inFromClient.readLine();

                if (fromclient.equals("q") || fromclient.equals("Q")) {
                    connected.close();
                    break;
                } else {
                    System.out.println("RECIEVED:" + fromclient);
                }

            }

        }
    }
}

Il codice cliente:

//TCPClient.java

import java.io.*;
import java.net.*;

class TCPClient {
    public static void main(String argv[]) throws Exception {
        String FromServer;
        String ToServer;

        Socket clientSocket = new Socket("localhost", 5000);

        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(
                System.in));

        PrintWriter outToServer = new PrintWriter(
                clientSocket.getOutputStream(), true);

        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(
                clientSocket.getInputStream()));

        while (true) {

            FromServer = inFromServer.readLine();

            if (FromServer.equals("q") || FromServer.equals("Q")) {
                clientSocket.close();
                break;
            } else {
                System.out.println("RECIEVED:" + FromServer);
                System.out.println("SEND(Type Q or q to Quit):");

                ToServer = inFromUser.readLine();

                if (ToServer.equals("Q") || ToServer.equals("q")) {
                    outToServer.println(ToServer);
                    clientSocket.close();
                    break;
                } else {
                    outToServer.println(ToServer);
                }
            }
        }
    }
}

Puoi per favore pubblicare il codice cliente? Se si tratta di un client remoto, assicurati di non avere problemi con il firewall!
casa

Ho disattivato i firewall sia su client che su server e ancora lo stesso problema
Samantha Catania,

2
Su quale interfaccia è in ascolto il server. Se stai solo ascoltando localhost, non puoi connetterti da remoto.
Thorbjørn Ravn Andersen,

Stavo cercando di connettermi in remoto mentre usavo localhost, face palm. Questa è la mia prima prova con TCP>. <Come posso farlo funzionare in remoto?
Samantha Catania,

Ricorda che potresti avere anche dei firewall hardware 'bare metal' nel mezzo ... funziona se client e server sono nella stessa scatola?
casa

Risposte:


323

Questa eccezione indica che non vi è alcun servizio in ascolto sull'IP / porta a cui si sta tentando di connettersi:

  • Stai provando a connetterti all'IP / Host o alla porta sbagliati.
  • Non hai avviato il tuo server.
  • Il tuo server non è in attesa di connessioni.
  • Sui server Windows, la coda di ascolto del backlog è piena.

52
Mi sento stupido per aver trascurato You have not started your server, ma era davvero il problema per me!
Alexis Leclerc,

Giusto per chiarire il punto: "Java core va bene". L'unico problema è che trascuriamo i problemi .. (stato del server, indirizzo IP, porta, connettività Internet - essere sullo stesso router è necessario per gli IP locali e altro)
Vinay Bhargav

1
Collin, cosa intendi esattamente con "il server non è in attesa di accettare connessioni"? La gente lo pappagella come se significasse qualcosa.
Marchese di Lorne,

L'ho scritto qualche tempo fa, ma penso di averlo inteso come un altro modo per dire che non hai avviato il tuo server.
Collin Price,

nel mio caso avevo quattro simulatori Gennymotion in esecuzione e stavo provando a caricare l'app sulla scheda Galaxy e stavo ottenendo questo errore. dopo aver letto molto dal compagno WEB, ho chiuso tutti i simulatori ed eclissi, ho ucciso l'ADP nel task manager e poi riavviato Eclipse e tutto ha iniziato a funzionare correttamente. Penso che quando hai più simulatori in esecuzione e poi provi a connettere il dispositivo, l'ADB impazzisce nella mia esperienza. quelli sono i miei due centesimi ... :)
Vincy,

40

Vorrei controllare:

  • Nome host e porta a cui stai tentando di connetterti
  • Il lato server è riuscito ad iniziare l'ascolto corretto
  • Nessun firewall blocca la connessione

Il punto di partenza più semplice è probabilmente provare a connettersi manualmente dal computer client utilizzando telnet o Putty. Se ciò ha esito positivo, il problema è nel codice client. In caso contrario, è necessario capire perché non è così. Wireshark può aiutarti in questo senso.


Ricevo questa eccezione a volte. Questo accade per un determinato periodo di tempo. Genera immediatamente questa eccezione. E poi tutto diventa perfetto. Ho un firewall nel server. Ma ho aggiunto una regola in entrata per consentire le connessioni in entrata sulla porta 8080. La regola viene talvolta ignorata?
Ashwin,

@Ashwin: È impossibile dirlo, davvero - dovresti capire esattamente fino a che punto arrivano i dati. Guarda i log del firewall, ecc.
Jon Skeet,

@JonSkeet come configurare il nostro firewall se si verifica questo errore?
Nikhil Pareek,

1
@Nikhil: non sono qualificato per rispondere, ma sospetto che chiunque sia qualificato avrebbe bisogno di molte più informazioni per poterti aiutare. (Per prima cosa, non sappiamo quale firewall hai ...)
Jon Skeet,

7

Devi connettere il tuo socket client al ServerSocket remoto. Invece di

Socket clientSocket = new Socket("localhost", 5000);

fare

Socket clientSocket = new Socket(serverName, 5000);

Il client deve connettersi a serverName che deve corrispondere al nome o IP della casella su cui è ServerSocketstata creata un'istanza (il nome deve essere raggiungibile dal computer client). A proposito: non è il nome che è importante, è tutto sugli indirizzi IP ...


Suppongo che li stia eseguendo entrambi sulla stessa macchina a scopo di test, motivo per cui localhost andrebbe bene usare
SE

@Aaron: Ha detto che funziona se client e server funzionano sulla stessa macchina (puoi trovare la risposta in un altro commento).
casa

'La riga sopra associa il socket a localhost' No, non lo lega a INADDR_ANY. Ciò gli consente di accettare connessioni tramite qualsiasi scheda di rete. Quello che sta facendo l'OP è già corretto. La risposta è completamente errata Downvoting.
Marchese di Lorne,

@EJP: hai ragione con ServerSocket, ho modificato la risposta. Tuttavia, clientSockettenta ancora di connettersi localhost.
casa il

@home È necessario rimuovere la frase relativa all'indirizzo di bind.
Marchese di Lorne,

7

Ho avuto lo stesso problema, ma eseguendo il server prima di eseguire il client è stato risolto.


4
Ovviamente devi eseguire il server prima del client. Eseguire prima il client e provare a connettersi al server significa che non ci si collega a nulla quando si accende il server.
user3308043

5
@ user3308043 Sì, era ovvio ma non era troppo ovvio per alcuni nuovi programmatori (come me 3 anni fa), quindi volevo solo condividerlo con quei compagni che erano all'oscuro come me.
Dao Lam,

Grazie, mi ha anche aiutato, la connessione di test ha avuto successo ma non è stato possibile visualizzare i dati delle tabelle.
Damien Christophe,

6

Un punto che vorrei aggiungere alle risposte sopra è la mia esperienza -

"Ho ospitato sul mio server su localhost e stavo cercando di connettermi ad esso tramite un emulatore Android specificando un URL appropriato come http://localhost/my_api/login.php. E stavo ricevendo un errore di connessione rifiutata "

Nota: quando sono appena passato al browser sul PC e ho utilizzato lo stesso URL ( http://localhost/my_api/login.php), ho ricevuto la risposta corretta

quindi il Problema nel mio caso era il termine localhostche ho sostituito con l' IP per il mio server (poiché il tuo server è ospitato sul tuo computer) che lo ha reso raggiungibile dal mio emulatore sullo stesso PC.


Per ottenere l'IP per il tuo computer locale, puoi usare il ipconfigcomando su cmd per ottenere IPv4 qualcosa come 192.68.xx.yy Voila .. quello è l'IP del tuo computer dove hai ospitato il tuo server. usalo quindi al posto di localhost

http://192.168.72.66/my_api/login.php


Nota: non sarai in grado di raggiungere questo IP privato da nessun nodo esterno a questo computer. (Nel caso sia necessario, è possibile utilizzare Ngnix per quello)


4

Ho avuto lo stesso problema con il broker Mqtt chiamato vernemq. ma risolto aggiungendo quanto segue.

  1. $ sudo vmq-admin listener show

per mostrare la lista di ips e port consentiti per vernemq

  1. $ sudo vmq-admin listener start port=1885 -a 0.0.0.0 --mountpoint /appname --nr_of_acceptors=10 --max_connections=20000

per aggiungere qualsiasi ip e la tua nuova porta. ora dovresti essere in grado di connetterti senza problemi.

Spero che risolva il tuo problema. inserisci qui la descrizione dell'immagine


1
Questo mi ha salvato la giornata, ma poiché vernemq non si installa con apt-get, alcune persone avranno bisogno di questo link: vernemq.com/docs/installation/debian_and_ubuntu.html
Damir Olejar

2

Spero che la mia esperienza possa essere utile a qualcuno. Ho affrontato il problema con la stessa traccia dello stack delle eccezioni e non riuscivo a capire quale fosse il problema. Il server di database che stavo cercando di connettere era in esecuzione e la porta era aperta e accettava le connessioni.

Il problema era con la connessione a Internet. La connessione Internet che stavo usando non era autorizzata a connettersi al server corrispondente. Quando ho modificato i dettagli della connessione, il problema è stato risolto.


1

Nel mio caso, ho dato al socket il nome del server (nel mio caso "raspberrypi"), e invece un indirizzo IPv4 lo ha reso, o per specificare, IPv6 era rotto (il nome è stato risolto in un IPv6)


1

Nel mio caso, ho dovuto mettere un segno di spunta vicino Expose daemon on tcp://localhost:2375 without TLSa dockercornice (sul lato destro della barra delle applicazioni, fare clic destro su docker, selezionare setting)


1

ho ricevuto questo errore perché ho chiuso ServerSocket all'interno di un ciclo for che tenta di accettare il numero di client al suo interno (non ho finito di accettare tutti i suggerimenti)

quindi fai attenzione a dove chiudere il tuo Socket


0

Ho avuto lo stesso problema e il problema era che non stavo chiudendo oggetto socket. Dopo aver usato socket.close (); problema risolto. Questo codice funziona per me.

ClientDemo.java

public class ClientDemo {
    public static void main(String[] args) throws UnknownHostException,
            IOException {
        Socket socket = new Socket("127.0.0.1", 55286);
        OutputStreamWriter os = new OutputStreamWriter(socket.getOutputStream());
        os.write("Santosh Karna");
        os.flush();
        socket.close();
    }
}

e ServerDemo.java

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        System.out.println("server is started");
        ServerSocket serverSocket= new ServerSocket(55286);
        System.out.println("server is waiting");
        Socket socket=serverSocket.accept();
        System.out.println("Client connected");
        BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String str=reader.readLine();
        System.out.println("Client data: "+str);
        socket.close();
        serverSocket.close();

    }
}

1
La mancata chiusura del socket client non causa un rifiuto della connessione. Non ci sarebbe essere un client socket al vicino se la connessione era stata rifiutata.
Marchese di Lorne,

0

Ho cambiato la mia rete DNS e il problema è stato risolto


-2

Ho avuto lo stesso problema e si è scoperto che l'autorizzazione del catalina.outfile non era corretta. Non era scrivibile dall'utente tomcat. Dopo aver corretto le autorizzazioni, il problema è stato risolto. Ho saputo che si tratta di un problema di autorizzazioni dai registri nel tomcat8-initd.logfile:

/usr/sbin/tomcat8: line 40: /usr/share/tomcat8/logs/catalina.out: Permission denied


1
'Autorizzazione negata' non è la stessa cosa di 'connessione rifiutata'.
Marchese di Lorne,

L'errore di autorizzazione negata si trovava nel tomcat8-initd.logfile mentre i log di output del server presentavano esattamente l'errore indicato nella domanda.
kbsbng,

-3

È possibile che sia presente un'istanza precedente del client ancora in esecuzione e in ascolto sulla porta 5000.


6
I clienti non ascoltano. Parlano.
Raedwald,

Un'istanza precedente causerebbe BindExceptiona sul server, non ConnectExceptionsul client.
Marchese di Lorne,
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.