java. net. ConnectException: connexion refusée
J'essaie d'implémenter une connexion TCP, tout fonctionne bien du côté du serveur mais quand 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 Du 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);
}
}
}
}
}
14 réponses
Cette exception signifie qu'il n'y a pas d'écoute de service 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 listen backlog est pleine.
Je vérifierais:
- Nom D'hôte et port auquel vous essayez de vous connecter
- Le serveur a réussi à commencer à écouter 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 est dans votre code client. Si ce n'est pas le cas, vous devez comprendre pourquoi ce n'est pas le cas. Wireshark peut vous aider ce front.
Vous devez connecter votre socket client au ServerSocket distant. Au lieu de
Socket clientSocket = new Socket("localhost", 5000);
Do
Socket clientSocket = new Socket(serverName, 5000);
Le client doit se connecter à serverName {[13] } qui doit correspondre au nom ou à L'adresse IP de la boîte sur laquelle votre ServerSocket
a été instancié (le nom doit être accessible depuis la machine cliente). BTW: ce n'est pas le nom qui est important, c'est tout au sujet des adresses IP...
J'ai eu le même problème avec le courtier MQTT appelé vernemq.mais résolu en ajoutant ce qui suit.
$ sudo vmq-admin listener show
Pour afficher la liste o IPS et ports autorisés pour vernemq
$ 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 être capable de vous connecter sans aucun problème.
J'ai eu le MÊME PROBLÈME, MAIS l'exécution du serveur avant d'exécuter le Client l'a corrigé.
Espère que mon expérience peut être utile à quelqu'un. J'ai fait face au problème avec la même trace de pile d'exception 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 avec la connexion internet. La connexion internet que j'utilisais n'était pas autorisée à se connecter au serveur correspondant. Lorsque j'ai changé les détails de la connexion, le problème a été résolu.
J'ai eu cette erreur parce que {[0] } qui essaient 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
Dans mon cas, j'ai donné au 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 résolu en IPv6)
Dans mon cas, j'ai dû mettre une coche près de Expose daemon on tcp://localhost:2375 without TLS
dans docker
paramètre (sur le côté droit de la barre des tâches, cliquez sur docker
, select setting
)
Numéro de Port toujours différent aux deux extrémités
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();
}
}
Un point que je tiens à ajouter aux réponses ci-dessus est mon expérience-
"j'ai hébergé sur mon serveur sur localhost et a tenté de se connecter via un émulateur android, en spécifiant une URL correcte, comme http://localhost/my_api/login.php
. Et je recevais erreur de connexion refusée "
Point à noter - Quand je suis juste allé au navigateur sur le PC et utiliser la même URL (http://localhost/my_api/login.php
) je recevais une réponse correcte
Donc, le problème dans mon cas était le terme localhost
que j'ai remplacé par le IP pour mon serveur (car votre serveur est hébergé sur votre machine) qui le rendait accessible depuis mon émulateur sur le même PC.
Pour obtenir L'adresse IP de votre machine locale, vous pouvez utiliser la commande ipconfig
sur cmd
vous obtiendrez IPv4 quelque chose comme 192.68.xx.aa
Le tour est joué ..C'est L'adresse IP de votre machine où vous avez hébergé votre serveur.
utilisez-le alors au lieu de localhost
http://192.168.72.66/my_api/login.php
Note-vous ne serez pas en mesure d'atteindre cette adresse IP privée de tout noeud en dehors de cet ordinateur. (Au cas où vous en auriez besoin, vous pouvez utiliser Ngnix pour cela)
Il se peut qu'une instance précédente du client soit toujours en cours d'exécution et en écoute sur le port 5000.
Essayez déconnectez {[2] } d'Internet (vous pouvez désactiver le wifi).