Ich versuche, eine TCP-Verbindung zu implementieren. Auf Serverseite funktioniert alles einwandfrei. Wenn ich jedoch das Client-Programm (vom Client-Computer) ausführe, wird die folgende Fehlermeldung angezeigt:
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)
Ich habe versucht, die Socket-Nummer zu ändern, falls sie verwendet wurde, aber ohne Erfolg. Weiß jemand, was diesen Fehler verursacht und wie er behoben werden kann?
Der Servercode:
//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);
}
}
}
}
}
Der Kundencode:
//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 Catania
quelle
quelle
Antworten:
Diese Ausnahme bedeutet, dass auf der IP / dem Port, zu dem Sie eine Verbindung herstellen möchten, kein Dienst überwacht wird:
quelle
You have not started your server
, aber es war in der Tat das Problem für mich!Ich würde überprüfen:
Der einfachste Ausgangspunkt ist wahrscheinlich der Versuch, eine manuelle Verbindung vom Client-Computer über Telnet oder Putty herzustellen. Wenn dies erfolgreich ist, liegt das Problem in Ihrem Client-Code. Wenn dies nicht der Fall ist, müssen Sie herausfinden, warum dies nicht der Fall ist. Wireshark kann Ihnen an dieser Front helfen.
quelle
Sie müssen Ihren Client-Socket mit dem Remote-ServerSocket verbinden. Anstatt
Socket clientSocket = new Socket("localhost", 5000);
machen
Socket clientSocket = new Socket(serverName, 5000);
Der Client muss eine Verbindung zu Servername herstellen, die mit dem Namen oder der IP- Adresse der Box übereinstimmen sollte, auf der Sie
ServerSocket
instanziiert wurden (der Name muss vom Clientcomputer aus erreichbar sein). Übrigens: Es ist nicht der Name, der wichtig ist, es geht nur um IP-Adressen ...quelle
ServerSocket
, ich habe die Antwort geändert. Trotzdem versucht derclientSocket
immer noch eine Verbindung herzustellenlocalhost
.Ich hatte das gleiche Problem, aber das Ausführen des Servers vor dem Ausführen des Clients hat es behoben.
quelle
Ich hatte das gleiche Problem mit dem Mqtt-Broker namens vernemq. Es wurde jedoch durch Hinzufügen des folgenden Problems gelöst.
$ sudo vmq-admin listener show
um die Liste der erlaubten IPs und Ports für vernemq anzuzeigen
$ sudo vmq-admin listener start port=1885 -a 0.0.0.0 --mountpoint /appname --nr_of_acceptors=10 --max_connections=20000
um eine IP und Ihren neuen Port hinzuzufügen. Jetzt sollten Sie in der Lage sein, ohne Probleme eine Verbindung herzustellen.
Hoffe, es löst Ihr Problem.
quelle
Ein Punkt, den ich zu den obigen Antworten hinzufügen möchte, ist meine Erfahrung -
"Ich habe auf meinem Server auf localhost gehostet und versucht, über einen Android-Emulator
http://localhost/my_api/login.php
eine Verbindung herzustellen, indem ich die richtige URL wie angegeben habe . Und ich habe den Fehler " Verbindung verweigert "erhalten."Hinweis - Als ich gerade zum Browser auf dem PC ging und dieselbe URL (
http://localhost/my_api/login.php
) verwendete, erhielt ich die richtige AntwortDas Problem in meinem Fall war also der Begriff,
localhost
den ich durch die IP für meinen Server ersetzt habe (da Ihr Server auf Ihrem Computer gehostet wird), wodurch er von meinem Emulator auf demselben PC aus erreichbar war.Um die IP für Ihren lokalen Computer
ipconfig
abzurufen , können Sie den Befehl auf cmd verwenden. Sie erhalten IPv4 wie 192.68.xx.yy Voila. Dies ist die IP Ihres Computers, auf der Ihr Server gehostet wird. Verwenden Sie es dann anstelle von localhosthttp://192.168.72.66/my_api/login.php
Hinweis - Sie können diese private IP von keinem Knoten außerhalb dieses Computers aus erreichen. (Falls nötig, können Sie dafür Ngnix verwenden)
quelle
Hoffe, meine Erfahrung kann für jemanden nützlich sein. Ich hatte das Problem mit demselben Exception-Stack-Trace und konnte das Problem nicht verstehen. Der Datenbankserver, den ich verbinden wollte, lief und der Port war offen und akzeptierte Verbindungen.
Das Problem war mit der Internetverbindung. Die von mir verwendete Internetverbindung durfte keine Verbindung zum entsprechenden Server herstellen. Als ich die Verbindungsdetails änderte, wurde das Problem behoben.
quelle
In meinem Fall gab ich dem Socket den Namen des Servers (in meinem Fall "raspberrypi"), und stattdessen wurde er durch eine IPv4-Adresse oder, um anzugeben, IPv6 beschädigt (der Name wurde in IPv6 aufgelöst).
quelle
In meinem Fall musste ich
Expose daemon on tcp://localhost:2375 without TLS
in derdocker
Einstellung ein Häkchen setzen (auf der rechten Seite der Taskleiste mit der rechten Maustaste klickendocker
, auswählensetting
)quelle
Ich habe diesen Fehler erhalten, weil ich
ServerSocket
in einer for-Schleife geschlossen habe, die versucht, die Anzahl der darin enthaltenen Clients zu akzeptieren (ich habe nicht alle Clints akzeptiert).Achten Sie also darauf, wo Sie Ihre Steckdose schließen können
quelle
Ich hatte das gleiche Problem und das Problem war, dass ich das Socket-Objekt nicht schloss. Nach der Verwendung von socket.close (); Problem gelöst. Dieser Code funktioniert für mich.
ClientDemo.java
und ServerDemo.java
quelle
Ich habe mein DNS-Netzwerk geändert und das Problem behoben
quelle
Ich hatte das gleiche Problem und es stellte sich heraus, dass die Erlaubnis der
catalina.out
Datei nicht korrekt war. Es war für den Tomcat-Benutzer nicht beschreibbar. Nachdem ich die Berechtigungen behoben hatte, wurde das Problem behoben. Ich habe aus den Protokollen in dertomcat8-initd.log
Datei erfahren, dass es sich um ein Berechtigungsproblem handelt :/usr/sbin/tomcat8: line 40: /usr/share/tomcat8/logs/catalina.out: Permission denied
quelle
tomcat8-initd.log
Datei, während die Serverausgabeprotokolle genau den in der Frage genannten Fehler aufwiesen.Es kann sein, dass eine frühere Instanz des Clients noch ausgeführt wird und Port 5000 überwacht.
quelle
BindException
am Server verursachen, keinConnectException
am Client.