java.net.ConnectException: Verbindung abgelehnt

185

Ich versuche, eine TCP-Verbindung zu implementieren. Auf Serverseite funktioniert alles einwandfrei. Wenn ich jedoch das Client-Programm (vom Client-Computer) ausführe, wird die folgende Fehlermeldung angezeigt:

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)

Ich habe versucht, die Socket-Nummer zu ändern, falls sie verwendet wurde, aber ohne Erfolg. Weiß jemand, was diesen Fehler verursacht und wie er behoben werden kann?

Der Servercode:

//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);
                }

            }

        }
    }
}

Der Kundencode:

//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);
                }
            }
        }
    }
}
Samantha Catania
quelle
Können Sie bitte den Kundencode posten? Wenn es sich um einen Remote-Client handelt, stellen Sie sicher, dass Sie keine Firewall-Probleme haben!
Hause
Ich habe Firewalls auf Client und Server ausgeschaltet und immer noch das gleiche Problem
Samantha Catania
2
Welche Schnittstelle hört der Server ab? Wenn Sie nur localhost abhören, können Sie keine Remoteverbindung herstellen.
Thorbjørn Ravn Andersen
Ich habe versucht, eine Remoteverbindung herzustellen, während ich localhost, Gesichtspalme, verwendet habe. Dies ist meine erste Testversion mit TCP>. <Wie kann ich dafür sorgen, dass es remote funktioniert?
Samantha Catania
Denken Sie daran, dass möglicherweise auch dazwischen einige Bare-Metal-Hardware-Firewalls vorhanden sind. Funktioniert dies, wenn sich Client und Server auf derselben Box befinden?
Hause

Antworten:

320

Diese Ausnahme bedeutet, dass auf der IP / dem Port, zu dem Sie eine Verbindung herstellen möchten, kein Dienst überwacht wird:

  • Sie versuchen, eine Verbindung mit der falschen IP / dem falschen Host oder Port herzustellen.
  • Sie haben Ihren Server nicht gestartet.
  • Ihr Server wartet nicht auf Verbindungen.
  • Auf Windows-Servern ist die Listen-Backlog-Warteschlange voll.
Collin Preis
quelle
51
Ich fühle mich dumm, das übersehen zu haben You have not started your server, aber es war in der Tat das Problem für mich!
Alexis Leclerc
Nur um den Punkt klar zu machen: "Java Core ist in Ordnung". Das einzige Problem ist, dass wir Probleme übersehen. (Serverstatus, IP-Adresse, Port, Internetverbindung - für lokale IPs und mehr muss man sich auf demselben Router befinden)
Vinay Bhargav
1
Collin, was genau meinst du mit "Der Server wartet nicht darauf, Verbindungen zu akzeptieren"? Die Leute machen sich Gedanken darüber, als ob es etwas bedeutet.
Marquis von Lorne
Ich habe das vor einiger Zeit geschrieben, aber ich denke, ich meinte es als eine andere Art zu sagen, dass Sie Ihren Server nicht gestartet haben.
Collin Price
In meinem Fall liefen vier Gennymotion-Simulatoren und ich versuchte, die App auf den Galaxy-Tab zu laden, und es wurde dieser Fehler angezeigt. Nachdem ich viel aus dem Buddy-WEB gelesen hatte, schloss ich alle Simulatoren und Eclipse, tötete den ADP im Task-Manager und startete Eclipse neu, und alles begann ordnungsgemäß zu funktionieren. Ich denke, wenn mehrere Simulatoren ausgeführt werden und Sie dann versuchen, ein Gerät anzuschließen, ist die ADB meiner Erfahrung nach verrückt. das sind meine zwei Cent ... :)
Vincy
39

Ich würde überprüfen:

  • Hostname und Port, zu dem Sie eine Verbindung herstellen möchten
  • Die Serverseite hat es geschafft, richtig zuzuhören
  • Es gibt keine Firewall, die die Verbindung blockiert

Der einfachste Ausgangspunkt ist wahrscheinlich der Versuch, eine manuelle Verbindung vom Client-Computer über Telnet oder Putty herzustellen. Wenn dies erfolgreich ist, liegt das Problem in Ihrem Client-Code. Wenn dies nicht der Fall ist, müssen Sie herausfinden, warum dies nicht der Fall ist. Wireshark kann Ihnen an dieser Front helfen.

Jon Skeet
quelle
Ich bekomme manchmal diese Ausnahme. Dies geschieht für einen bestimmten Zeitraum. Diese Ausnahme wird sofort ausgelöst. Und dann wird alles gut. Ich habe eine Firewall im Server. Ich habe jedoch eine eingehende Regel hinzugefügt, um eingehende Verbindungen über Port 8080 zuzulassen. Wird die Regel manchmal ignoriert?
Ashwin
@Ashwin: Es ist wirklich unmöglich zu sagen - Sie müssten genau herausfinden, wie weit die Daten kommen. Schauen Sie sich Ihre Firewall-Protokolle usw. an
Jon Skeet
@ JonSkeet Wie konfiguriere ich unsere Firewall, wenn dieser Fehler auftritt?
Nikhil Pareek
1
@Nikhil: Ich bin nicht qualifiziert , das zu beantworten, aber ich vermute , wer ist qualifiziert wäre viel mehr Informationen müssen in der Lage sein , Ihnen zu helfen. (Zum einen wissen wir nicht, welche Firewall Sie haben ...)
Jon Skeet
6

Sie müssen Ihren Client-Socket mit dem Remote-ServerSocket verbinden. Anstatt

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

machen

Socket clientSocket = new Socket(serverName, 5000);

Der Client muss eine Verbindung zu Servername herstellen, die mit dem Namen oder der IP- Adresse der Box übereinstimmen sollte, auf der Sie ServerSocketinstanziiert wurden (der Name muss vom Clientcomputer aus erreichbar sein). Übrigens: Es ist nicht der Name, der wichtig ist, es geht nur um IP-Adressen ...

Zuhause
quelle
Ich gehe davon aus, dass sie beide zu Testzwecken auf demselben Computer ausführt, weshalb localhost in Ordnung wäre
SE
@ Aaron: Sie sagte, es funktioniert, wenn Client und Server auf demselben Computer ausgeführt werden (die Antwort finden Sie in einem anderen Kommentar).
Hause
'Die obige Zeile bindet den Socket an localhost' Nein, nicht, sie bindet ihn an INADDR_ANY. Dadurch können Verbindungen über eine beliebige Netzwerkkarte akzeptiert werden. Was das OP tut, ist bereits richtig. Die Antwort ist völlig falsch. Downvoting.
Marquis von Lorne
@EJP: Du hast Recht mit dem ServerSocket, ich habe die Antwort geändert. Trotzdem versucht der clientSocketimmer noch eine Verbindung herzustellen localhost.
Hause
@home Sie müssen den Satz über die Bindungsadresse entfernen .
Marquis von Lorne
6

Ich hatte das gleiche Problem, aber das Ausführen des Servers vor dem Ausführen des Clients hat es behoben.

Dao Lam
quelle
3
Natürlich müssen Sie den Server vor dem Client ausführen. Wenn Sie den Client zuerst ausführen und versuchen, eine Verbindung zum Server herzustellen, stellen Sie beim Starten Ihres Servers eine Verbindung zu nichts her.
user3308043
4
@ user3308043 Ja, es war offensichtlich, aber für einige neue Programmierer (wie mich vor 3 Jahren) war es nicht allzu offensichtlich, also wollte ich es nur mit jenen Leuten teilen, die ahnungslos waren wie ich.
Dao Lam
Danke, es hat mir auch geholfen, die Testverbindung war erfolgreich, konnte aber keine Tabellendaten anzeigen.
Damien Christophe
4

Ich hatte das gleiche Problem mit dem Mqtt-Broker namens vernemq. Es wurde jedoch durch Hinzufügen des folgenden Problems gelöst.

  1. $ sudo vmq-admin listener show

um die Liste der erlaubten IPs und Ports für vernemq anzuzeigen

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

um eine IP und Ihren neuen Port hinzuzufügen. Jetzt sollten Sie in der Lage sein, ohne Probleme eine Verbindung herzustellen.

Hoffe, es löst Ihr Problem. Geben Sie hier die Bildbeschreibung ein

MrOnyancha
quelle
1
Dies hat mir den Tag gerettet, aber da vernemq nicht mit apt-get installiert wird, benötigen einige Leute diesen Link: vernemq.com/docs/installation/debian_and_ubuntu.html
Damir
4

Ein Punkt, den ich zu den obigen Antworten hinzufügen möchte, ist meine Erfahrung -

"Ich habe auf meinem Server auf localhost gehostet und versucht, über einen Android-Emulatorhttp://localhost/my_api/login.php eine Verbindung herzustellen, indem ich die richtige URL wie angegeben habe . Und ich habe den Fehler " Verbindung verweigert "erhalten."

Hinweis - Als ich gerade zum Browser auf dem PC ging und dieselbe URL ( http://localhost/my_api/login.php) verwendete, erhielt ich die richtige Antwort

Das Problem in meinem Fall war also der Begriff, localhostden ich durch die IP für meinen Server ersetzt habe (da Ihr Server auf Ihrem Computer gehostet wird), wodurch er von meinem Emulator auf demselben PC aus erreichbar war.


Um die IP für Ihren lokalen Computer ipconfigabzurufen , können Sie den Befehl auf cmd verwenden. Sie erhalten IPv4 wie 192.68.xx.yy Voila. Dies ist die IP Ihres Computers, auf der Ihr Server gehostet wird. Verwenden Sie es dann anstelle von localhost

http://192.168.72.66/my_api/login.php


Hinweis - Sie können diese private IP von keinem Knoten außerhalb dieses Computers aus erreichen. (Falls nötig, können Sie dafür Ngnix verwenden)

eRaisedToX
quelle
2

Hoffe, meine Erfahrung kann für jemanden nützlich sein. Ich hatte das Problem mit demselben Exception-Stack-Trace und konnte das Problem nicht verstehen. Der Datenbankserver, den ich verbinden wollte, lief und der Port war offen und akzeptierte Verbindungen.

Das Problem war mit der Internetverbindung. Die von mir verwendete Internetverbindung durfte keine Verbindung zum entsprechenden Server herstellen. Als ich die Verbindungsdetails änderte, wurde das Problem behoben.

Phönix
quelle
1

In meinem Fall gab ich dem Socket den Namen des Servers (in meinem Fall "raspberrypi"), und stattdessen wurde er durch eine IPv4-Adresse oder, um anzugeben, IPv6 beschädigt (der Name wurde in IPv6 aufgelöst).

Zhyano
quelle
1

In meinem Fall musste ich Expose daemon on tcp://localhost:2375 without TLSin der dockerEinstellung ein Häkchen setzen (auf der rechten Seite der Taskleiste mit der rechten Maustaste klicken docker, auswählen setting)

user1419243
quelle
1

Ich habe diesen Fehler erhalten, weil ich ServerSocketin einer for-Schleife geschlossen habe, die versucht, die Anzahl der darin enthaltenen Clients zu akzeptieren (ich habe nicht alle Clints akzeptiert).

Achten Sie also darauf, wo Sie Ihre Steckdose schließen können

Basheer AL-MOMANI
quelle
0

Ich hatte das gleiche Problem und das Problem war, dass ich das Socket-Objekt nicht schloss. Nach der Verwendung von socket.close (); Problem gelöst. Dieser Code funktioniert für mich.

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();
    }
}

und 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();

    }
}
Santosh Karna
quelle
1
Wenn der Client-Socket nicht geschlossen wird, wird die Verbindung nicht abgelehnt. Es wäre nicht sein eine Client - Socket zu schließen , wenn die Verbindung abgelehnt worden war.
Marquis von Lorne
0

Ich habe mein DNS-Netzwerk geändert und das Problem behoben

Eli Nb
quelle
-2

Ich hatte das gleiche Problem und es stellte sich heraus, dass die Erlaubnis der catalina.outDatei nicht korrekt war. Es war für den Tomcat-Benutzer nicht beschreibbar. Nachdem ich die Berechtigungen behoben hatte, wurde das Problem behoben. Ich habe aus den Protokollen in der tomcat8-initd.logDatei erfahren, dass es sich um ein Berechtigungsproblem handelt :

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

kbsbng
quelle
1
"Erlaubnis verweigert" ist nicht dasselbe wie "Verbindung verweigert".
Marquis von Lorne
Der Fehler "Berechtigung verweigert" befand sich in der tomcat8-initd.logDatei, während die Serverausgabeprotokolle genau den in der Frage genannten Fehler aufwiesen.
kbsbng
-3

Es kann sein, dass eine frühere Instanz des Clients noch ausgeführt wird und Port 5000 überwacht.

Michael Munsey
quelle
6
Kunden hören nicht zu. Sie sprechen.
Raedwald
Eine vorherige Instanz würde ein BindExceptionam Server verursachen, kein ConnectExceptionam Client.
Marquis von Lorne