Comment corriger l'erreur java.net.ConnectException: Connection refused

J’essaie de mettre en place une connexion TCP, tout fonctionne bien du côté du serveur mais lorsque je lance le programme client (depuis 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:12)

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

Le code du serveur :

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

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

        ServerSocket Server = new ServerSocket(9000);

        System.out.println("Server En attente un client sur le port 9000");

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

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

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

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

            while (true) {

                System.out.println("ENVOI(Tapez Q ou q pour quitter):");
                toclient = br1.readLine();

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

                fromclient = br2.readLine();

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

            }

        }
    }
}

Le code client :

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", 9000);

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

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

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

        while (true) {

            FromServer = br2.readLine();

            if (FromServer.equals("q") || FromServer.equals("Q")) {
                clientSocket.close();
                break;
            } else {
                System.out.println("RECU:" + FromServer);
                System.out.println("ENVOI(Tapez Q ou q pour quitter):");

                ToServer = br1.readLine();

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

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

  • Vous essayez de vous connecter à la mauvaise adresse IP/hôte ou au mauvais port.
  • Vous n’avez pas démarré votre serveur.
  • Votre serveur n’est pas à l’écoute des connexions.
  • Sur les serveurs Windows, la file d’attente d’écoute est pleine.

Quelle interface le serveur écoute-t-il ? Si vous n’écoutez que sur localhost, vous ne pouvez pas vous connecter à distance.

J’ai essayé de me connecter à distance en utilisant localhost, :woman_facepalming:. C’est mon premier essai avec TCP >.< Comment puis-je le faire fonctionner à distance ?

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

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

faire

Socket clientSocket = new Socket(serverName, 9000);

Le client doit se connecter à serverName qui doit correspondre au nom ou à l’IP de la machine sur laquelle votre ServeurSocket a été instancié (le nom doit être accessible depuis la machine du client). Note : Ce n’est pas le nom qui est important, c’est l’adresse IP…

Vous devez vérifier :

  • Le nom de l’hôte et le port sur lequel vous essayez de vous connecter.
  • Le serveur a réussi à démarrer l’écoute correctement
  • Aucun pare-feu ne bloque la connexion.

Le point de départ le plus simple est probablement d’essayer de se connecter manuellement à partir de la machine cliente en utilisant telnet ou Putty. Si cela réussit, alors le problème se trouve dans le code de votre client.

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