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);
}
}
}
}
}
Cette exception signifie qu’aucun service n’écoute sur l’IP/le port auquel vous essayez de vous connecter:
Je vérifierais:
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.
J'ai eu le même problème avec le courtier Mqtt appelé vernemq.but l'a 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 une adresse IP et votre nouveau port. maintenant vous devriez pouvoir vous connecter sans aucun problème.
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.
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 ...
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.
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)
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
)
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)
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
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();
}
}
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
Numéro de port toujours différent aux deux extrémités