web-dev-qa-db-fra.com

java.net.ConnectException: connexion refusée

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), l'erreur suivante apparaît:

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 y remédier?.

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);
                }
            }
        }
    }
}
153
Samantha Catania

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

  • Vous essayez de vous connecter au mauvais IP/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 saturée.
270
Collin Price

Je vérifierais:

  • Nom d'hôte et port auxquels 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 cliente à l'aide de telnet ou de PuTTY. Si cela réussit, le problème provient de votre code client. Si ce n'est pas le cas, vous devez résoudre pourquoi ce n'est pas le cas. Wireshark peut vous aider sur ce front.

34
Jon Skeet

J'ai eu le même problème avec le courtier Mqtt appelé vernemq.but l'a 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 une adresse IP et votre nouveau port. maintenant vous devriez pouvoir vous connecter sans aucun problème. 

J'espère que cela résoudra votre problème .  enter image description here

4
MrOnyancha

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

4
Dao Lam

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

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

faire

Socket clientSocket = new Socket(serverName, 5000);

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

4
home

J'espère que mon expérience pourra être utile à quelqu'un. J'ai fait face au problème avec la même trace de pile d'exception et je ne comprenais pas 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 avec 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 la connexion, le problème a été résolu.

2
phoenix

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 une URL appropriée, telle que http://localhost/my_api/login.php. Et j'obtenais erreur de connexion refusée "

Point à noter - Quand je suis juste allé au navigateur sur le PC et utilisais la même URL (http://localhost/my_api/login.php) J'obtenais la réponse correcte

le problème dans mon cas était donc le terme localhost que j'ai remplacé par leIPde mon serveur (car votre serveur est hébergé sur votre ordinateur), ce qui le rendait accessible depuis mon émulateur sur le même PC.


Pour obtenir une adresse IP pour votre ordinateur local, vous pouvez utiliser la commande ipconfig de la commande cmd Vous obtiendrez un IPv4 de type 192.68.xx.yy Voilà, l'adresse IP de votre ordinateur sur lequel votre serveur est hébergé . Use alors 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 situé en dehors de cet ordinateur. (Si vous en avez besoin, vous pouvez utiliser Ngnix pour cela)

1
eRaisedToX

Dans mon cas, je devais mettre une coche près de Expose daemon on tcp://localhost:2375 without TLS dans le paramètre docker (à droite de la barre des tâches, cliquer à droite sur docker, sélectionner setting)

1
user1419243

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 était cassé (le nom résolu en IPv6)

1
Zhyano

j'ai eu cette erreur parce que I closed ServerSocket inside a for loop qui essaye d'accepter le nombre de clients qu'il contient (je n'ai pas fini d'accepter tous les clints)

alors soyez prudent où fermer votre Socket

1

J'ai eu le même problème et le problème était que je ne fermais pas l'objet socket. Après l'utilisation de 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();

    }
}
0
Santosh Karna

J'ai eu le même problème, et il s'est avéré que c'était dû à l'autorisation du fichier catalina.out de ne pas être correcte. Il n'était pas accessible en écriture pour 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 à partir des journaux du fichier Tomcat8-initd.log:

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

0
kbsbng

Numéro de port toujours différent aux deux extrémités

0
Harshil Kulkarni