Aplicación con sockets no funciona en LAN (sólo con localhost)

Iniciado por NathanD, 18 Noviembre 2013, 10:26 AM

0 Miembros y 1 Visitante están viendo este tema.

NathanD

Estoy creando una aplicación cliente-servidor lo más sencilla posible (para luego implementar más cosas), pero estoy teniendo problemas para ejecutarlo en la LAN de mi casa (ya entonces de WAN ni de hablamos, el cual es mi propósito...). Sólo funciona cuando tanto el servidor como el cliente son el mismo localhost, si no, me salta la siguiente excepción:
java.net.ConnectException: Connection refused: connect

Os dejo los fuentes. Cliente:
Código (java) [Seleccionar]

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:
Código (java) [Seleccionar]

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


Gracias de antemano y saludos.

egyware

Bastante extraño, y exactamente en donde te lanza esa excepción?

Te recomiendo, que te uses Telnet (si usas Windows no viene instalado por defecto debes agregarlo o si usas linux ya viene integrado).
Primero abres el servidor y luego con Telnet, en una maquina ajena donde está el servidor, intentas conectarte. Si esto no funciona es probable  que Java esté siendo bloqueado por algún firewall y que esté causándote problemas.

Bueno has esa prueba y nos cuentas!

NathanD

Cita de: egyware en 18 Noviembre 2013, 11:51 AM
Bastante extraño, y exactamente en donde te lanza esa excepción?

Te recomiendo, que te uses Telnet (si usas Windows no viene instalado por defecto debes agregarlo o si usas linux ya viene integrado).
Primero abres el servidor y luego con Telnet, en una maquina ajena donde está el servidor, intentas conectarte. Si esto no funciona es probable  que Java esté siendo bloqueado por algún firewall y que esté causándote problemas.

Bueno has esa prueba y nos cuentas!

Gracias por responder. No pone la línea en la que se lanza la excepción.

Usando Telnet estoy igual, sólo no establece la conexión ni en la maquina ajena del servidor ni en la propia. Me dice lo siguiente:
Microsoft Telnet> open 5000
Conectándose a 5000...No se puede abrir la conexión al host, en puerto 23: Error
en la conexión


He desactivado tanto el firewall como el antivirus. Ni idea de qué puede tratarse...

Gracias y un saludo.

egyware

Al preguntarte donde te lanza esa excepción te preguntaba si en el cliente o en el servidor.
ahora ojo:
el telnet puedes usarlo así

telnet ip port


o


telnet
open ip port




NathanD

La excepción me salta en el Cliente.

Ya consigo hacer el Telnet desde un ordenador distinto, que es un paso :D La cosa es por qué no funciona desde el propio programa del servidor, ¿cuál es el problema?

Muchísimas gracias por tu atención.

egyware

#5
Funciona impecable

Código (java) [Seleccionar]

try{
InetAddress address = InetAddress.getByName("egyware.no-ip.org");
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){
e.printStackTrace();
System.out.println("Error en la conexión." );

} catch (Exception e) {
e.printStackTrace();
}


Lo estoy probando con el pc mi casa y con el de la oficina.
Probablemente tengas algunos problemas con la configuración de redes con Windows (parece que si usas Windows) verifica que estés en una red Hogar o Trabajo, si estás en una publica probablemente estés muy restringido.

Y bueno te digo algunas cosas para que tomes en consideración:

  • Hice pequeños cambios al código, prácticamente nada.
  • Desbloqueé el puerto cuando el Firewall de windows pregunta por primera vez al usar tal puerto(por defecto siempre está activada desbloquear para redes hogareñas o trabajo).
  • El servidor está detrás de un router con los puertos desbloqueados.

Dejaré el servidor abierto si es que quieres probar, (ya van 2 iteraciones de 10)

Saludos!

NathanD

Vaya, qué extraño... Probaré lo de la configuración de redes de Windows, a ver. He estado alternando con Windows y Ubuntu por si el problema era de alguno de éstos, pero miraré lo que me has dicho.

Muchas gracias por tu ayuda!!

NathanD

#7
Nada, no hay manera. Haciendo el Telnet sí, pero desde la aplicación de Servidor no. He mirado las configuraciones de redes de Windows, desactivado Firewall y Antivirus, y nada. He probado hasta a hacer un .jar de cada programa y ejectuarlo desde la consola de Windows por si el problema era Eclipse, pero tampoco.

egyware

Cita de: NathanD en 19 Noviembre 2013, 11:16 AM
Nada, no hay manera. Haciendo el Telnet sí, pero desde la aplicación de Servidor no. He mirado las configuraciones de redes de Windows, desactivado Firewall y Antivirus, y nada.

Ya no se como ayudarte, al parecer el problema va más de java.
Insistiendo si es que que programaste algo mal, podrías probar esta biblioteca https://github.com/EsotericSoftware/kryonet (utiliza NIO). Y si con esto no funciona definitivamente problema de tu red.


Saludos!



NathanD

Cita de: egyware en 19 Noviembre 2013, 11:49 AM
Ya no se como ayudarte, al parecer el problema va más de java.
Insistiendo si es que que programaste algo mal, podrías probar esta biblioteca https://github.com/EsotericSoftware/kryonet (utiliza NIO). Y si con esto no funciona definitivamente problema de tu red.


Saludos!



No te preocupes, bastante me has ayudado ya. Miraré la biblioteca que me has puesto, gracias.
Luego probaré la aplicación en la universidad, a ver. De todas formas, si quisiera que la aplicación funcionara no sólo en una LAN sino en Internet (mi intención desde un principio), ¿tendría que hacer alguna modificación?

Muchas gracias por tu ayuda, un saludo.