java.net.ConnectException: connexion refusée

186

J'essaie d'implémenter une connexion TCP, tout fonctionne bien du côté du serveur mais lorsque j'exécute le programme client (à partir de l'ordinateur client), j'obtiens l'erreur suivante:

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)

J'ai essayé de changer le numéro de socket au cas où il était utilisé, mais en vain, est-ce que quelqu'un sait ce qui cause cette erreur et comment la réparer.

Le code serveur:

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

            }

        }
    }
}

Le code client:

//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 Catane
la source
Pouvez-vous s'il vous plaît poster le code client? S'il s'agit d'un client distant, assurez-vous que vous n'avez aucun problème de pare-feu!
domicile le
J'ai désactivé les pare-feu sur le client et le serveur et toujours le même problème
Samantha Catania
2
Sur quelle interface le serveur écoute-t-il. Si vous n'écoutez que sur localhost, vous ne pouvez pas vous connecter à distance.
Thorbjørn Ravn Andersen
J'essayais de me connecter à distance en utilisant localhost, face palm. Ceci est mon premier essai avec TCP>. <Comment le faire fonctionner à distance?
Samantha Catania le
N'oubliez pas que vous pouvez également avoir des pare-feu matériels `` bare metal '' entre les deux ... est-ce que cela fonctionne si le client et le serveur sont sur la même boîte?
domicile le

Réponses:

323

Cette exception signifie qu'aucun service n'écoute sur l'IP / le port auquel vous essayez de vous connecter:

  • Vous essayez de vous connecter à la mauvaise adresse IP / hôte ou port.
  • Vous n'avez pas démarré votre serveur.
  • Votre serveur n'écoute pas les connexions.
  • Sur les serveurs Windows, la file d'attente du backlog d'écoute est pleine.
Prix ​​Collin
la source
52
Je me sens stupide d'avoir négligé le You have not started your server, mais c'était effectivement le problème pour moi!
Alexis Leclerc
Juste pour clarifier le point - "Java core est très bien". Le seul problème est que nous négligeons les problèmes. (État du serveur, adresse IP, port, connectivité Internet - être sur le même routeur est indispensable pour les adresses IP locales et plus)
Vinay Bhargav
1
Collin, qu'entendez-vous exactement par «le serveur n'attend pas pour accepter les connexions»? Les gens racontent cela comme si cela signifiait quelque chose.
Marquis de Lorne
J'ai écrit ceci il y a quelque temps, mais je pense que je l'ai voulu dire comme une autre façon de dire que vous n'avez pas démarré votre serveur.
Prix ​​Collin
dans mon cas, j'avais quatre simulateurs Gennymotion en cours d'exécution et j'essayais de charger l'application sur l'onglet Galaxy et j'obtenais cette erreur. après avoir beaucoup lu sur le WEB du copain, j'ai ensuite fermé tous les simulateurs et éclipse, tué l'ADP dans le gestionnaire de tâches, puis redémarré l'Eclipse et tout a commencé à fonctionner correctement. Je pense que lorsque vous avez plusieurs simulateurs en cours d'exécution et que vous essayez de connecter un appareil, l'ADB devient fou d'après mon expérience. ce sont mes deux cents ... :)
Vincy
40

Je vérifierais:

  • Nom d'hôte et port auquel vous essayez de vous connecter
  • Le côté serveur a réussi à commencer à écouter correctement
  • Il n'y a pas de pare-feu bloquant la connexion

Le point de départ le plus simple est probablement d'essayer de se connecter manuellement à partir de la machine client en utilisant telnet ou Putty. Si cela réussit, le problème réside dans votre code client. Si ce n'est pas le cas, vous devez déterminer pourquoi ce n'est pas le cas. Wireshark peut vous aider sur ce front.

Jon Skeet
la source
J'obtiens parfois cette exception. Cela se produit pendant une période de temps donnée. Il lève immédiatement cette exception. Et puis tout va bien. J'ai un pare-feu sur le serveur. Mais j'ai ajouté une règle entrante pour autoriser les connexions entrantes sur le port 8080. La règle est-elle parfois ignorée?
Ashwin
@Ashwin: Il est impossible de dire, vraiment - vous auriez besoin de déterminer exactement jusqu'où vont les données. Regardez vos journaux de pare-feu, etc.
Jon Skeet
@JonSkeet comment configurer notre pare-feu si nous avons cette erreur?
Nikhil Pareek
1
@Nikhil: Je ne suis pas qualifié pour répondre, mais je soupçonne que quelqu'un qui est qualifié aurait besoin de beaucoup plus d' informations pour être en mesure de vous aider. (D'une part, nous ne savons pas quel pare-feu vous avez ...)
Jon Skeet
7

Vous devez connecter votre socket client au ServerSocket distant. Au lieu de

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

faire

Socket clientSocket = new Socket(serverName, 5000);

Le client doit se connecter à serverName qui doit correspondre au nom ou à l'adresse IP de la boîte sur laquelle votre a ServerSocketété instancié (le nom doit être accessible depuis la machine cliente). BTW: Ce n'est pas le nom qui est important, c'est une question d'adresses IP ...

Accueil
la source
Je suppose qu'elle les exécute tous les deux sur la même machine à des fins de test, c'est pourquoi localhost conviendrait parfaitement
SE
@Aaron: Elle a dit que cela fonctionne si le client et le serveur fonctionnent sur la même machine (vous pouvez trouver la réponse dans un autre commentaire).
domicile le
'La ligne ci-dessus lie la socket à localhost' Non, elle la lie à INADDR_ANY. Cela lui permet d'accepter les connexions via n'importe quel NIC. Ce que fait l'OP est déjà correct. La réponse est complètement incorrecte. Le vote négatif.
Marquis of Lorne
@EJP: Vous avez raison avec le ServerSocket, j'ai modifié la réponse. Néanmoins, le clientSocketessaie toujours de se connecter à localhost.
domicile
@home Vous devez supprimer la phrase concernant l'adresse de liaison.
Marquis of Lorne
7

J'ai eu le même problème, mais exécuter le serveur avant d'exécuter le client l'a corrigé.

Dao Lam
la source
4
Bien sûr, vous devez exécuter le serveur avant le client. Exécuter d'abord le client et essayer de se connecter au serveur signifie que vous ne vous connectez à rien lorsque vous démarrez votre serveur.
user3308043
5
@ user3308043 Oui, c'était évident mais ce n'était pas trop évident pour certains nouveaux programmeurs (comme moi il y a 3 ans) donc je voulais juste le partager avec ces gars qui n'avaient aucune idée comme moi.
Dao Lam
Merci, cela m'a également aidé, la connexion de test a été réussie mais n'a pu afficher aucune donnée de table.
Damien Christophe
6

Un point que je voudrais ajouter aux réponses ci-dessus est mon expérience -

"J'ai hébergé sur mon serveur sur localhost et j'essayais de me connecter via un émulateur Android en spécifiant l'URL appropriée comme http://localhost/my_api/login.php. Et j'obtenais une erreur de refus de connexion "

Point à noter - Lorsque je suis juste allé dans le navigateur sur le PC et que j'utilise la même URL ( http://localhost/my_api/login.php), j'obtenais une réponse correcte

donc le problème dans mon cas était le terme localhostque j'ai remplacé par l' adresse IP de mon serveur (car votre serveur est hébergé sur votre machine), ce qui le rend accessible depuis mon émulateur sur le même PC.


Pour obtenir l'IP de votre machine locale, vous pouvez utiliser la ipconfigcommande sur cmd, vous obtiendrez IPv4 quelque chose comme 192.68.xx.yy Voila .. c'est l'adresse IP de votre machine où vous avez hébergé votre serveur. utilisez-le ensuite au lieu de localhost

http://192.168.72.66/my_api/login.php


Remarque - vous ne pourrez pas accéder à cette adresse IP privée à partir d'un nœud extérieur à cet ordinateur. (Au cas où vous en auriez besoin, vous pouvez utiliser Ngnix pour cela)

eRaisedToX
la source
4

J'ai eu le même problème avec le courtier Mqtt appelé vernemq. mais je l'ai résolu en ajoutant ce qui suit.

  1. $ sudo vmq-admin listener show

pour afficher la liste des ips et ports autorisés pour vernemq

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

pour ajouter n'importe quelle adresse IP et votre nouveau port. maintenant, vous devriez pouvoir vous connecter sans aucun problème.

J'espère que cela résout votre problème. entrez la description de l'image ici

MrOnyancha
la source
1
Cela m'a sauvé la journée, mais comme vernemq ne s'installe pas avec apt-get, certaines personnes auront besoin de ce lien: vernemq.com/docs/installation/debian_and_ubuntu.html
Damir Olejar
2

J'espère que mon expérience peut être utile à quelqu'un. J'ai rencontré le problème avec la même trace de pile d'exceptions et je ne pouvais pas comprendre quel était le problème. Le serveur de base de données que j'essayais de connecter était en cours d'exécution et le port était ouvert et acceptait les connexions.

Le problème était lié à la connexion Internet. La connexion Internet que j'utilisais n'était pas autorisée à se connecter au serveur correspondant. Lorsque j'ai modifié les détails de connexion, le problème a été résolu.

phénix
la source
1

Dans mon cas, j'ai donné à la socket le nom du serveur (dans mon cas "raspberrypi"), et à la place une adresse IPv4 l'a fait, ou pour spécifier, IPv6 a été cassé (le nom a été résolu en IPv6)

Zhyano
la source
1

Dans mon cas, j'ai dû mettre une coche à côté Expose daemon on tcp://localhost:2375 without TLSdu dockerparamètre (sur le côté droit de la barre des tâches, faites un clic droit sur docker, sélectionnez setting)

user1419243
la source
1

J'ai eu cette erreur parce que j'ai fermé ServerSocketune boucle for qui essaie d'accepter le nombre de clients à l'intérieur (je n'ai pas fini d'accepter tous les clints)

alors faites attention où fermer votre socket

Basheer AL-MOMANI
la source
0

J'ai eu le même problème et le problème était que je ne fermais pas l'objet socket. Après avoir utilisé socket.close (); problème résolu. Ce code fonctionne pour moi.

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

et 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
la source
1
Ne pas fermer le socket client n'entraîne pas de refus de connexion. Il n'y aurait pas être un socket client de fermer si la connexion avait été refusée.
Marquis of Lorne
0

J'ai changé mon réseau DNS et cela a résolu le problème

Eli Nb
la source
-2

J'ai eu le même problème, et il s'est avéré que la permission du catalina.outfichier n'était pas correcte. Il n'était pas accessible en écriture par l'utilisateur tomcat. Une fois que j'ai corrigé les autorisations, le problème a été résolu. J'ai appris qu'il s'agissait d'un problème d'autorisations lié aux journaux du tomcat8-initd.logfichier:

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

kbsbng
la source
1
«Autorisation refusée» n'est pas la même chose que «connexion refusée».
Marquis of Lorne
L'erreur Autorisation refusée se trouvait dans le tomcat8-initd.logfichier tandis que les journaux de sortie du serveur avaient exactement l'erreur mentionnée dans la question.
kbsbng le
-3

Il se peut qu'une instance précédente du client soit toujours en cours d'exécution et à l'écoute sur le port 5000.

Michael Munsey
la source
6
Les clients n'écoutent pas. Ils parlent.
Raedwald le
Une instance précédente provoquerait un BindExceptionsur le serveur, pas un ConnectExceptionsur le client.
Marquis of Lorne