Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Aplicación Cliente-Servidor con sockets no funciona correctamente

Hola buenas, estoy haciendo una pequeña aplicación cliente-servidor para luego implementarla en otro proyecto, pero estoy atascado.

Si ejecuto tanto el Cliente como el Servidor en el mismo PC, sí funciona. En cambio, si los ejecuto en ordenadores distintos de la misma LAN, me salta la siguiente excepción en el Cliente:
java.net.ConnectException: Connection refused: connect
Y el servidor ni se inmuta.

Lo raro es lo siguiente: si en vez de ejecutar el Cliente, hago un Telnet a la IP de destino al puerto que está escuchando el Servidor, lo hace correctamente. Me estoy volviendo loco, he hecho todo lo que se me ha ocurrido: probarlo en la red de mi casa y de la universidad, alternando Windows con Ubuntu, incluso con máquinas virtuales de por medio... Y nada. Telnet sí, pero desde la aplicación no.

Os dejo los fuentes. Cliente:

import java.io.DataInputStream;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;


public class Cliente {
//Constantes
final int PUERTO = 7000;
//final String HOST = "192.168.1.36";

/************/

//Métodos - constructor
public Cliente(){

try{
InetAddress address = InetAddress.getLocalHost();
Socket skCliente;

skCliente = new Socket(address, PUERTO);
InputStream aux = skCliente.getInputStream();
DataInputStream flujo = new DataInputStream(aux);
System.out.println(flujo.readUTF());
skCliente.close();

} catch(UnknownHostException e){
System.out.println( e );
   System.out.println("Error en la conexión." );
   
} catch (Exception e) {
System.out.println(e);

}
}

//Cuerpo del programa
public static void main(String[] args){
new Cliente();


}

}

Servidor:

import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;


public class Servidor {
//Constantes
final int MAX_CLIENTES = 5;
final int PUERTO = 7000;
/************/

//Métodos - constructor
public Servidor(){
ServerSocket skServidor;
try {
skServidor = new ServerSocket(PUERTO);
System.out.println("Escucho el puerto: "+PUERTO);
for(int numCli = 0; numCli < MAX_CLIENTES; numCli++){
Socket skCliente = skServidor.accept();
System.out.println("\tSirvo al cliente: "+skCliente.getRemoteSocketAddress());
OutputStream aux = skCliente.getOutputStream();
DataOutputStream flujo = new DataOutputStream(aux);
flujo.writeUTF("\nHola cliente "+ skCliente.getRemoteSocketAddress());
skCliente.close();
}

} catch(UnknownHostException e){
System.out.println( e );
   System.out.println("Error en la conexión." );
   
}
   catch (Exception e) {
// TODO Auto-generated catch block
System.out.println(e);
}
}

public static void main(String[] args){
new Servidor();
}
}

Estoy desesperado, no sé qué más hacer ya.

Gracias de antemano y un saludo.

noviembre 24, 2013 | Registered Commenternathand

Buenas,

He probado tu codigo y a mi si me funciona sin problemas asi que puedes descartar que el problema este en el codigo. Si puedes acceder por telnet a mi lo unico que me cuadra es que el firewall SI contiene una excepcion para telnet pero NO para el proceso java.exe. Trata de configurar el firewall para abrir la conexion de java.exe en puerto 7000 (de hecho yo para una primera prueba desactivaria completamente el firewall)

P.D: como veras, hay mucha gente que ha tenido este problema, asi que no desesperes:
http://stackoverflow.com/questions/4959760/java-networking-connection-refused-connect
http://stackoverflow.com/questions/3602167/java-networking-connection-refused-yes-my-server-is-running


Suerte y un saludo

noviembre 25, 2013 | Unregistered CommenterUnoPorAhi

Buenas, gracias por contestar. Se me olvidó mencionar que también lo he probado desactivando el firewall y el antivirus en todas las máquinas en las que lo he probado, y nada. Aunque volveré a probar, a ver.

Gracias y saludos.

noviembre 25, 2013 | Registered Commenternathand

Cada vez estoy más desconcertado... He abierto el puerto en el Router y http://www.canyouseeme.org/ dice que mi puerto no está bloqueado y que lo puede ver (y en el Servidor aparece como cliente), pero con la aplicación de Cliente en la LAN de mi casa, nada, igual, conexión rechazada. Lo acabo de probar con firewall y antivirus desactivado.

noviembre 25, 2013 | Registered Commenternathand

@nathand, el problema es básicamente que tu programa cliente siempre apunta al localhost, al menos que le especifiques la direccion ip del servidor, al que debe acceder, jamas vas a poder tener un cliente servidor porque tu cliente siempre buscar el servidor en la maquina local.
para hacer tu socket cliente por ejemplo seria asi:
skCliente = new Socket("192.192.168.1.2", PUERTO);
donde "192.192.168.1.2", es la ip donde pones tu servidor, claro esa es de ejemplo puedes poner la que quieras

saludos

noviembre 26, 2013 | Registered Commenterjhosep

Muchas gracias por responder jhosep, aunque justamente venía a decir que ya he conseguido solucionar el problema, lo único que tenía que hacer era poner la IP del host del servidor. También funciona en WAN, así que perfecto.

Muchas gracias a todos.

noviembre 26, 2013 | Registered Commenternathand

Anda, yo pensaba que lo que ponias era simplemente un ejemplo de como hacias en local y que cuando probabas en red (LAN o WAN) apuntabas a la constante HOST (que en el ejemplo tienes comentada).

Me alegro de que se haya solucionado.

Un saludo

noviembre 26, 2013 | Unregistered CommenterUnoPorAhi

Me explicas como solucionaste tu problema, me suced lo mismo !
Gracias.

agosto 19, 2014 | Unregistered CommenterNiss

Gracias! No podía resolver el problema, y gracias a un comentario aquí, lo solucioné. En mi caso que corro un programa java como servidor (windows 10), un un cliente en Android conectados al wi-fi de mi casa, lo que hice es agregar una regla de entrada al firewall para el programa java.exe (por las dudas agregué el del jre y los de sdk). Hay que poner la direccion IPv4 en el adress (no la mascara de subred ) del cliente android (si ejecutan ipconfig en la consola de windows se las muestra), y en mi caso utilicé el puerto 5000 (8080 o el que sea supongo salvo los puertos predeterminados). Gracias y saludos!!

marzo 3, 2017 | Unregistered CommenterFabrico