Sto cercando di implementare una connessione TCP, tutto funziona bene dal lato del server, ma quando eseguo il programma client (dal computer client) ottengo il seguente errore:
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)
Ho provato a cambiare il numero di socket nel caso in cui fosse in uso, ma senza alcun risultato, qualcuno sa che cosa sta causando questo errore e come risolverlo.
Il codice server:
//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);
}
}
}
}
}
Il codice cliente:
//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);
}
}
}
}
}
Questa eccezione indica che non vi è alcun ascolto del servizio sull'IP/porta a cui si sta tentando di connettersi:
Controllerei:
Il punto di partenza più semplice è probabilmente quello di provare a connettersi manualmente dalla macchina client usando telnet o PuTTY. Se ciò riesce, allora il problema è nel tuo codice cliente. In caso contrario, è necessario risolvere perché non è così. Wireshark potrebbe aiutarti su questo fronte.
Ho avuto lo stesso problema con il broker Mqtt chiamato vernemq.but risolto con l'aggiunta di quanto segue.
$ Sudo vmq-admin listener show
per mostrare la lista o permesso ips e ports per vernemq
$ Sudo vmq-admin listener start port=1885 -a 0.0.0.0 --mountpoint /appname --nr_of_acceptors=10 --max_connections=20000
per aggiungere qualsiasi IP e la tua nuova porta. ora dovresti riuscire a connetterti senza problemi.
Ho avuto lo stesso problema, ma l'esecuzione del server prima di eseguire il client lo ha risolto.
Devi connettere il tuo client socket al ServerSocket remoto. Invece di
Socket clientSocket = new Socket("localhost", 5000);
fare
Socket clientSocket = new Socket(serverName, 5000);
Il client deve connettersi a serverName che deve corrispondere al nome o IP della casella in cui è stata istanziata la ServerSocket
(il nome deve essere raggiungibile dalla macchina client). BTW: Non è il nome che è importante, è tutto sugli indirizzi IP ...
Spero che la mia esperienza possa essere utile a qualcuno. Ho affrontato il problema con la stessa traccia dello stack di eccezione e non ho potuto capire quale fosse il problema. Il server di database che stavo cercando di connettersi era in esecuzione e la porta era aperta e stava accettando le connessioni.
Il problema era con la connessione internet. La connessione Internet che stavo usando non era autorizzata a connettersi al server corrispondente. Quando ho cambiato i dettagli della connessione, il problema è stato risolto.
Un punto che vorrei aggiungere alle risposte di cui sopra è la mia esperienza -
"Ho ospitato il mio server su localhost e stavo cercando di connettermi tramite un emulatore di Android specificando l'URL corretto come http://localhost/my_api/login.php
. E stavo ricevendo errore di connessione rifiutata "
Punto da notare - Quando sono appena andato al browser sul PC e uso lo stesso URL (http://localhost/my_api/login.php
) stavo ottenendo una risposta corretta
quindi il problema nel mio caso era il termine localhost
che ho sostituito conIPper il mio server (dato che il tuo server è ospitato sulla tua macchina) che lo ha reso raggiungibile dal mio emulatore sullo stesso PC.
Per ottenere l'IP per la tua macchina locale, puoi usare il comando ipconfig
su cmd Otterrai IPv4 qualcosa come 192.68.xx.yy Voila ..che è l'IP della tua macchina in cui hai il server ospitato . Usa allora invece di localhost
http://192.168.72.66/my_api/login.php
Nota: non sarà possibile raggiungere questo IP privato da nessun nodo esterno al computer. (Nel caso sia necessario, puoi usare Ngnix per quello)
Nel mio caso, ho dovuto inserire un segno di spunta vicino a Expose daemon on tcp://localhost:2375 without TLS
nell'impostazione docker
(sul lato destro della barra delle applicazioni, fare clic con il tasto destro su docker
, selezionare setting
)
Nel mio caso, ho dato al socket il nome del server (nel mio caso "raspberrypi"), e invece un indirizzo IPv4 lo ha reso, o per specificare, IPv6 era rotto (il nome risolto in un IPv6)
ho ricevuto questo errore perché I closed ServerSocket inside a for loop
che tenta di accettare il numero di client al suo interno (non ho finito di accettare tutti i clints)
quindi stai attento a dove chiudere la tua presa
Ho avuto lo stesso problema e il problema era che non stavo chiudendo l'oggetto socket. Dopo aver usato socket.close (); problema risolto . Questo codice funziona per me.
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();
}
}
e 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();
}
}
Ho avuto lo stesso problema, ed è risultato essere dovuto al permesso del file catalina.out
che non è corretto. Non era scrivibile dall'utente Tomcat. Una volta risolti i permessi, il problema è stato risolto. Devo sapere che si tratta di un problema di autorizzazioni dai log nel file Tomcat8-initd.log
:
/usr/sbin/Tomcat8: line 40: /usr/share/Tomcat8/logs/catalina.out: Permission denied
Numero di porta sempre diverso a entrambe le estremità