Estoy tratando de implementar una conexión TCP, todo funciona bien desde el lado del servidor, pero cuando ejecuto el programa cliente (desde la computadora cliente) obtengo el siguiente error:
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)
Intenté cambiar el número de socket en caso de que estuviera en uso, pero fue en vano, ¿alguien sabe qué está causando este error y cómo solucionarlo?
El código del servidor:
//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);
}
}
}
}
}
El código del 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);
}
}
}
}
}
java
networking
tcp
Samantha Catania
fuente
fuente
Respuestas:
Esta excepción significa que no hay servicio escuchando en el IP / puerto al que está intentando conectarse:
fuente
You have not started your server
, pero de hecho fue el problema para mí.Yo verificaría:
El punto de partida más simple es probablemente intentar conectarse manualmente desde la máquina del cliente usando telnet o Putty. Si eso tiene éxito, entonces el problema está en su código de cliente. Si no es así, debe averiguar por qué no lo ha hecho. Wireshark puede ayudarte en este frente.
fuente
Debe conectar su socket de cliente al ServerSocket remoto. En vez de
Socket clientSocket = new Socket("localhost", 5000);
hacer
Socket clientSocket = new Socket(serverName, 5000);
El cliente debe conectarse a serverName, que debe coincidir con el nombre o la dirección IP del cuadro en el que
ServerSocket
se creó la instancia (el nombre debe ser accesible desde la máquina del cliente). Por cierto: no es el nombre lo importante, se trata de direcciones IP ...fuente
ServerSocket
, modifiqué la respuesta. Sin embargo, elclientSocket
todavía intenta conectarselocalhost
.Tuve el mismo problema, pero la ejecución del servidor antes de ejecutar el cliente lo solucionó.
fuente
Un punto que me gustaría agregar a las respuestas anteriores es mi experiencia :
"Me alojé en mi servidor en localhost y estaba tratando de conectarme a él a través de un emulador de Android especificando la URL correcta como
http://localhost/my_api/login.php
. Y estaba recibiendo un error de conexión rechazada "Punto a tener en cuenta: cuando solo fui al navegador en la PC y utilicé la misma URL (
http://localhost/my_api/login.php
) recibí la respuesta correctaentonces el problema en mi caso era el término
localhost
que reemplacé con la IP para mi servidor (ya que su servidor está alojado en su máquina) que lo hizo accesible desde mi emulador en la misma PC.Para obtener IP para su máquina local, puede usar
ipconfig
comando en cmd, obtendrá IPv4 algo así como 192.68.xx.yy Voila ... esa es la IP de su máquina donde tiene alojado su servidor. úsalo entonces en lugar de localhosthttp://192.168.72.66/my_api/login.php
Nota: no podrá acceder a esta IP privada desde ningún nodo fuera de esta computadora. (En caso de que lo necesite, puede usar Ngnix para eso)
fuente
Tuve el mismo problema con el agente Mqtt llamado vernemq. Pero lo resolví agregando lo siguiente.
$ sudo vmq-admin listener show
para mostrar la lista de ips y puertos permitidos para vernemq
$ sudo vmq-admin listener start port=1885 -a 0.0.0.0 --mountpoint /appname --nr_of_acceptors=10 --max_connections=20000
para agregar cualquier ip y su nuevo puerto. ahora deberías poder conectarte sin ningún problema.
Espero que resuelva tu problema.
fuente
Espero que mi experiencia pueda ser útil para alguien. Enfrenté el problema con el mismo seguimiento de pila de excepciones y no pude entender cuál era el problema. El servidor de la base de datos que intentaba conectar estaba funcionando y el puerto estaba abierto y aceptaba conexiones.
El problema era con la conexión a internet. La conexión a Internet que estaba usando no tenía permiso para conectarse al servidor correspondiente. Cuando cambié los detalles de la conexión, el problema se resolvió.
fuente
En mi caso, le di al socket el nombre del servidor (en mi caso "raspberrypi"), y en su lugar lo hizo una dirección IPv4, o para especificar, IPv6 estaba roto (el nombre se resolvió en un IPv6)
fuente
En mi caso, tuve que poner una marca de verificación cerca
Expose daemon on tcp://localhost:2375 without TLS
en ladocker
configuración (en el lado derecho de la barra de tareas, haga clic derecho endocker
, seleccionarsetting
)fuente
recibí este error porque cerré
ServerSocket
dentro de un bucle for que intenta aceptar la cantidad de clientes que contiene (no terminé de aceptar todos los clints)así que ten cuidado donde cerrar tu zócalo
fuente
Tuve el mismo problema y el problema era que no estaba cerrando el objeto socket. Después de usar socket.close (); problema resuelto. Este código me funciona.
ClientDemo.java
y ServerDemo.java
fuente
Cambié mi red DNS y solucionó el problema
fuente
Tuve el mismo problema, y resultó ser debido a que el permiso del
catalina.out
archivo no era correcto. No fue escrito por el usuario tomcat. Una vez que arreglé los permisos, el problema se resolvió. Llegué a saber que es un problema de permisos de los registros en eltomcat8-initd.log
archivo:/usr/sbin/tomcat8: line 40: /usr/share/tomcat8/logs/catalina.out: Permission denied
fuente
tomcat8-initd.log
archivo mientras que los registros de salida del servidor tenían exactamente el error mencionado en la pregunta.Puede ser que haya una instancia anterior del cliente que todavía se está ejecutando y escuchando en el puerto 5000.
fuente
BindException
en el servidor, no unConnectException
en el cliente.