java.net.ConnectException: conexión rechazada

186

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);
                }
            }
        }
    }
}
Samantha Catania
fuente
¿Puedes publicar el código del cliente? Si es un cliente remoto, ¡asegúrese de no tener problemas con el firewall!
Inicio
Apagué los cortafuegos tanto en el cliente como en el servidor y sigo con el mismo problema
Samantha Catania
2
En qué interfaz está escuchando el servidor. Si solo está escuchando en localhost, no puede conectarse de forma remota.
Thorbjørn Ravn Andersen
Intentaba conectarme de forma remota mientras usaba localhost, cara palma. Esta es mi primera prueba con TCP>. <¿Cómo hago que funcione de forma remota?
Samantha Catania
Recuerde que también puede tener algunos cortafuegos de hardware 'bare metal' en el medio ... ¿funciona si el cliente y el servidor están en la misma caja?
Inicio

Respuestas:

323

Esta excepción significa que no hay servicio escuchando en el IP / puerto al que está intentando conectarse:

  • Está intentando conectarse a la IP / Host o puerto incorrecto.
  • No ha iniciado su servidor.
  • Su servidor no está escuchando conexiones.
  • En los servidores de Windows, la lista de espera para escuchar está llena.
Precio Collin
fuente
52
Me siento tonto por haber pasado por alto el You have not started your server, pero de hecho fue el problema para mí.
Alexis Leclerc
Solo para aclarar el punto: "El núcleo de Java está bien". El único problema es que pasamos por alto los problemas ... (estado del servidor, dirección IP, puerto, conectividad a Internet; estar en el mismo enrutador es obligatorio para IP locales y más)
Vinay Bhargav
1
Collin, ¿qué quieres decir exactamente con "el servidor no está esperando para aceptar conexiones"? La gente está repitiendo esto como si significara algo.
Marqués de Lorne
Escribí esto hace un tiempo, pero creo que lo dije como otra forma de decir que no has iniciado tu servidor.
Precio de Collin el
en mi caso, tenía cuatro simuladores Gennymotion en ejecución e intentaba cargar la aplicación en la pestaña Galaxy y recibía este error. Después de leer mucho de la web de amigos, cerré todos los simuladores y eclipse, eliminé el ADP en el administrador de tareas y luego reinicié el Eclipse y todo comenzó a funcionar correctamente. Creo que cuando tienes varios simuladores en ejecución y luego intentas conectar el dispositivo, el ADB se vuelve loco en mi experiencia. esos son mis dos centavos ... :)
Vincy
40

Yo verificaría:

  • Nombre de host y puerto al que intenta conectarse
  • El lado del servidor ha logrado comenzar a escuchar correctamente
  • No hay firewall que bloquee la conexión

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.

Jon Skeet
fuente
A veces tengo esta excepción. Esto sucede por un período de tiempo particular. Inmediatamente arroja esta excepción. Y luego todo se pone bien. Tengo un firewall en el servidor. Pero he agregado una regla de entrada para permitir conexiones entrantes en el puerto 8080. ¿Se ignora la regla a veces?
Ashwin
@Ashwin: Realmente es imposible decirlo: necesitaría calcular exactamente qué tan lejos están llegando los datos. Mire los registros de su firewall, etc.
Jon Skeet
@JonSkeet ¿cómo configurar nuestro firewall si tenemos este error?
Nikhil Pareek
1
@Nikhil: No estoy calificado para responder eso, pero sospecho que cualquiera que esté calificado necesitaría mucha más información para poder ayudarlo. (Por un lado, no sabemos qué firewall tiene ...)
Jon Skeet
7

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 ServerSocketse 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 ...

hogar
fuente
Supongo que los está ejecutando en la misma máquina con fines de prueba, por lo que estaría bien usar localhost
SE
@ Aaron: Dijo que funciona si el cliente y el servidor se ejecutan en la misma máquina (puede encontrar la respuesta en otro comentario).
Inicio
'La fila anterior vincula el socket al localhost' No, no lo hace, lo vincula a INADDR_ANY. Eso le permite aceptar conexiones a través de cualquier NIC. Lo que está haciendo el OP ya es correcto. La respuesta es completamente incorrecta. Votación a favor.
Marqués de Lorne
@EJP: Tienes razón con el ServerSocket, modifiqué la respuesta. Sin embargo, el clientSockettodavía intenta conectarse localhost.
casa el
@home Debe eliminar la frase sobre la dirección de enlace.
Marqués de Lorne
7

Tuve el mismo problema, pero la ejecución del servidor antes de ejecutar el cliente lo solucionó.

Dao Lam
fuente
44
Por supuesto, debe ejecutar el servidor antes que el cliente. Ejecutar el cliente primero e intentar conectarse al servidor significa que no se está conectando a nada cuando enciende su servidor.
user3308043
55
@ user3308043 Sí, era obvio, pero no era demasiado obvio para algunos programadores nuevos (como yo hace 3 años), así que solo quería compartirlo con esos tipos que no tenían ni idea como yo.
Dao Lam
Gracias, también me ayudó, la conexión de prueba fue exitosa pero no pudo mostrar ninguna tabla de datos.
Damien Christophe
6

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 correcta

entonces 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 localhost

http://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)

eRaisedToX
fuente
4

Tuve el mismo problema con el agente Mqtt llamado vernemq. Pero lo resolví agregando lo siguiente.

  1. $ sudo vmq-admin listener show

para mostrar la lista de ips y puertos permitidos para vernemq

  1. $ 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. ingrese la descripción de la imagen aquí

MrOnyancha
fuente
1
Esto me salvó el día, pero como vernemq no se instala con apt-get, algunas personas necesitarán este enlace: vernemq.com/docs/installation/debian_and_ubuntu.html
Damir Olejar
2

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ó.

fénix
fuente
1

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)

Zhyano
fuente
1

En mi caso, tuve que poner una marca de verificación cerca Expose daemon on tcp://localhost:2375 without TLSen la dockerconfiguración (en el lado derecho de la barra de tareas, haga clic derecho en docker, seleccionar setting)

usuario1419243
fuente
1

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

Basheer AL-MOMANI
fuente
0

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

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();
    }
}

y 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();

    }
}
Santosh Karna
fuente
1
No cerrar el socket del cliente no causa un rechazo de conexión. No habría ser un socket de cliente a cerca de si la conexión ha sido rechazada.
Marqués de Lorne
0

Cambié mi red DNS y solucionó el problema

Eli Nb
fuente
-2

Tuve el mismo problema, y ​​resultó ser debido a que el permiso del catalina.outarchivo 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 el tomcat8-initd.logarchivo:

/usr/sbin/tomcat8: line 40: /usr/share/tomcat8/logs/catalina.out: Permission denied

kbsbng
fuente
1
'Permiso denegado' no es lo mismo que 'conexión denegada'.
Marqués de Lorne
El error de permiso denegado estaba en el tomcat8-initd.logarchivo mientras que los registros de salida del servidor tenían exactamente el error mencionado en la pregunta.
kbsbng
-3

Puede ser que haya una instancia anterior del cliente que todavía se está ejecutando y escuchando en el puerto 5000.

Michael Munsey
fuente
66
Los clientes no escuchan. Ellos hablan.
Raedwald
Una instancia anterior causaría un BindExceptionen el servidor, no un ConnectExceptionen el cliente.
Marqués de Lorne