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);
}
}
}
}
}
java
networking
tcp
Samantha Catane
la source
la source
Réponses:
Cette exception signifie qu'aucun service n'écoute sur l'IP / le port auquel vous essayez de vous connecter:
la source
You have not started your server
, mais c'était effectivement le problème pour moi!Je vérifierais:
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.
la source
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 ...la source
ServerSocket
, j'ai modifié la réponse. Néanmoins, leclientSocket
essaie toujours de se connecter àlocalhost
.J'ai eu le même problème, mais exécuter le serveur avant d'exécuter le client l'a corrigé.
la source
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 correctedonc le problème dans mon cas était le terme
localhost
que 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
ipconfig
commande 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 localhosthttp://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)
la source
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.
$ sudo vmq-admin listener show
pour afficher la liste des 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 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.
la source
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.
la source
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)
la source
Dans mon cas, j'ai dû mettre une coche à côté
Expose daemon on tcp://localhost:2375 without TLS
dudocker
paramètre (sur le côté droit de la barre des tâches, faites un clic droit surdocker
, sélectionnezsetting
)la source
J'ai eu cette erreur parce que j'ai fermé
ServerSocket
une 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
la source
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
et ServerDemo.java
la source
J'ai changé mon réseau DNS et cela a résolu le problème
la source
J'ai eu le même problème, et il s'est avéré que la permission du
catalina.out
fichier 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 dutomcat8-initd.log
fichier:/usr/sbin/tomcat8: line 40: /usr/share/tomcat8/logs/catalina.out: Permission denied
la source
tomcat8-initd.log
fichier tandis que les journaux de sortie du serveur avaient exactement l'erreur mentionnée dans la question.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.
la source
BindException
sur le serveur, pas unConnectException
sur le client.