Resultados 1 al 14 de 14

[Sockets] Problema conexión Chat Java (funciona en LAN pero no en conexión Remota).

  1. #1 [Sockets] Problema conexión Chat Java (funciona en LAN pero no en conexión Remota). 
    Iniciado
    Fecha de ingreso
    Jul 2010
    Mensajes
    26
    Descargas
    0
    Uploads
    0
    Hola,

    Programé un chat en java y al probarlo conectando desde un ordeador remoto me dio error: java.net.ConnectException: Connection timed out: connect. Aunque lo había probado ya en la LAN y funciona al 100%.

    Sé que es posible que sea por el firewall pero creo que es más seguro que sea un problema de programación, he leido información y al parecer los protocolos de conexiones en LANs son diferentes a los protocolos de conexiones Remotas y no te estoy seguro de ese dato, ¿alguien podría confirmármelo? También se me ocurrió crearme un dominio en www.no-ip.com y hacer que el chat use esa dirección ip para conectar al servidor y no la misma dirección IP pública.

    Añado también que para conectar al chat el único parámetro relevante que uso es mi IP pública.


    Códigos : aquí.
    Citar  
     

  2. #2  
    Moderador Global Avatar de hystd
    Fecha de ingreso
    Jul 2005
    Ubicación
    1, 11, 21, 1211...
    Mensajes
    1.596
    Descargas
    58
    Uploads
    0
    Una cosa es el protocolo de aplicación y otra la topología de la red... No tienen nada que ver...

    Haciendo referencia a las capas del modelo OSI y a modo de ejemplo, tendríamos por ejemplo los siguientes protocolos:

    Nivel Físico: RS232, Coaxial, Fibra óptica, RadioFrecuencia, un tio montado en un burro etc...
    Nivel de Enlace: Ethernet o 802.3, Wifi o 802.11, PPP, etc...
    Nivel de Red: ARP, IP, X.25, ICMP, NetBEUI, etc...
    Nivel de Transporte: TCP, UDP, etc...
    Nivel de Sesión: SSL, NetBios, RPC, etc...
    Nivel de Presentación: PSAP, SSAP, (Paso a través, o dicho de otra forma: "pillo la info, no hago nada y se la doy al siguiente nivel"), etc...
    Nivel de Aplicación: HTTP, FTP, POP3, SMTP, IRC, ICQ, Telnet, etc...

    En una comunicación de un sistema distribuido, al menos deben existir los 3 primeros (son OBLIGATORIOS y sin ellos no habría comunicación). Los 4 siguientes serán optativos y dependerá del uso final.

    La topología de la red (local, internet, etc.), hace referencia a los 3 primeros niveles, y la comunicación es cosa suya... De forma que al programador de la aplicación le da igual que la info vaya por una fibra óptica, o que vaya un tio en un burro para llevar y traer la info. La tarea de decidir a quién, cómo y cuando la llevan a cabo la tarjeta de red del equipo (nivel de enlace) y el router (nivel de red).

    En tu caso, seguramente habrás ido directamente a la capa Aplicación y habrás usado el protocolo correspondiente (o en otro caso, te habrás improvisado uno basandote en tu arquitectura cliente/servidor)... También puedes que hayas metido (o usado implícitamente, si has usado clases ya implementadas), protocolos a nivel de transporte (normalmente TCP).

    Con todo esto quiero decir que, si usas por ejemplo el protocolo HTTP, o FTP, o ICQ O etc..., en tu aplicación, da igual que el servidor esté en China y el tio en su burro tenga que llevar y traer la info desde y hasta el cliente, como que el servidor esté en la habitación o sala de al lado y sea un cablecito CAT-5, o incluso en tu propia máquina local. El protocolo de aplicación es independiente de la arquitectura de la red y de su topología.

    Por tanto, si lo único que has implementado es la aplicación, habrás tenido que hacer uso de algún protocolo de aplicación, y a ese protocolo le da igual lo que haya por debajo (presentación, sesión, transporte, red, enlace y físico) y de cómo se las apañen para llevar y traer la información al destinatario...

    Por tanto apostaría a que es más un problema de configuración de tu router/firewall (Nivel de red).

    Un saludo.
    El optimista tiene ideas, el pesimista... excusas

    Citar  
     

  3. #3  
    Iniciado
    Fecha de ingreso
    Jul 2010
    Mensajes
    26
    Descargas
    0
    Uploads
    0
    Era un problema de que tenía que mapear el puerto, publiqué la duda en otro foro y me la solucionaron allí. Gracias por contestar, si quieres pongo el enlace al hilo del otro foro aquí .
    Citar  
     

  4. #4  
    Moderador Global Avatar de hystd
    Fecha de ingreso
    Jul 2005
    Ubicación
    1, 11, 21, 1211...
    Mensajes
    1.596
    Descargas
    58
    Uploads
    0
    Si, ponlo, y más recomendable es que publiques tus conclusiones , y así podemos aprender tod@s.

    Un saludo.
    El optimista tiene ideas, el pesimista... excusas

    Citar  
     

  5. #5  
    Iniciado
    Fecha de ingreso
    Jul 2010
    Mensajes
    26
    Descargas
    0
    Uploads
    0
    El hilo es www.elhacker.net en este link. Sinceramente la única conclusión que saqué de eso es que el problema no siempre está en el código xD, me dejé un montón de tiempo buscando la manera en la que crear el socket correctamente para que conectase, y luego todo era un simple problema de puertos jeje... en fin xD.

    Un saludo.
    Citar  
     

  6. #6  
    Moderador Global Avatar de hystd
    Fecha de ingreso
    Jul 2005
    Ubicación
    1, 11, 21, 1211...
    Mensajes
    1.596
    Descargas
    58
    Uploads
    0
    Ok! gracias por el link. Para la próxima ya sabes por donde abordar el problema (ver post anterior). Acuérdate que un protocolo de aplicación le da igual que por debajo el cliente/servidor destino esté en otro equipo dentro de una red local y nada más, o que el cliente/servidor esté en internet o que simplemente esté en tu propio equipo.

    Un saludo.
    El optimista tiene ideas, el pesimista... excusas

    Citar  
     

  7. #7  
    Iniciado
    Fecha de ingreso
    Jul 2010
    Mensajes
    26
    Descargas
    0
    Uploads
    0
    si, ahora esa parte está controlada, ya no me como más la cabeza pensando si el problema está en el medio en eque se transmite la información ni nada similar, que pa eso está la máquina virtual xD.

    pero ahora tengo un problema al usar Threads junto con Sockets, hago bastantes códigos y todos se me traban, quiero hacer un sencillo sistema de mensajería, pero cuando no me da error, simplemente se me queda trabado como si no recibiese los mensajes, te improviso un ejemplo de lo que hago:



    Código:
                import java.net.*;
                import java.io.*;
    public class servidor extends Thread{
    
                   private Socket socket;
                   private ServerSocket socketServidor;
                   BufferedReader leerConsola = new BufferedReader(new InputStreamReader (System.in));
                   BufferedReader leerCliente;
                   BufferedWriter escribirCliente;
    
                   public Servidor (int puerto){
    
                   try{
                   socketServidor = new ServerSocker(puerto);
                   while (true){
                   socket = socketServidor.accept();
                   this.start();
                   } 
                   } catch (IOException ioe) {}
                   }
    
                  public static void main (String args[]){ new Servidor (6789); }
    
                  public void run(){
                   leerCliente = new BufferedReader (socket.getInputStreamReader()));
                   escribirCliente = new BufferedWriter (socket.getOutputStreamReader()));
                   System.out.println(leerCliente.readLine());
                   escribirCliente.write(leerConsola.readLine());
                   }
    }
    Código:
                import java.net.*;
                import java.io.*;
    
                public class Cliente extends Thread {
    
                String ip;
                int puerto;
                Socket socket;
                BufferedReader leerConsola = new BufferedReader (new InputStreamReader(System.in));
                BufferedReader leerServidor;
                BuferedWriter escribirServidor;
                public Cliente (String ip, int puerto) {
    
                this.ip = ip;
                this.puerto = puerto;
                try{
                socket = new Socket(ip,puerto);
                leerServidor = new BufferedReader (new InputStreamReader (socket.getInputStreamReader()));
                escribirServidor = new BufferedWriter (new OutputStreamWriter(socket.getOutputStreamWriter()));
                this.start} catch (IOException ioe){}
                }
    
                public static void main (String args[]) { new Cliente("localhost",6789);}
    
                public void run(){
                
                   System.out.println(leerServidor.readLine());
                   escribirServidor.write(leerConsola.readLine());
                }
    
    }

    Si eso diese un error de compilación no importa porque el código yo lo compilo sin problema, ese lo acabo de improvisar aquí en el mismo editor de respuesta rápida del foro. Pero haciendo códigos similares los mensajes simplemente nunca llegan se envían del cliente al servidor ni vise versa, si pudieses ayudarme te lo agradecería, porque no sé muy bien como funcionan los Thread, nunca hice nada con ellos y no los comprendo del todo.

    PD: este tema creo que es un poco extenso... si me pudieses ayudar por mensajería instantánea te lo agradecería porque no creo que se solucione rápido si no... xDDD mi msn es : [email protected] .

    Un saludo, y gracias de antemano.
    Última edición por clarinetista; 28-07-2010 a las 17:04
    Citar  
     

  8. #8  
    Co-Admin HackHispano.com Avatar de clarinetista
    Fecha de ingreso
    Jan 2004
    Ubicación
    HackHispano/SM
    Mensajes
    7.773
    Descargas
    31
    Uploads
    8
    -Localhost-, pídelo vía mp no mails, que están prohibidos.......
    Citar  
     

  9. #9  
    Moderador HH
    Fecha de ingreso
    Apr 2010
    Mensajes
    1.052
    Descargas
    7
    Uploads
    0
    Jeje clavito lo solucionastes? o me tienes que seguir utilizando de conejillo de indias? xD aunque los dos vemos que ese conejillo está mal eh? xD Descargaré uno prefabricado y será mas facil...
    • Taller de programación HackHispano: http://tallerdeprogramacion.es
    • Wargame HackHispano: [PRÓXIMAMENTE]
    • Normas del foro: http://foro.hackhispano.com/announcement.php?f=2
    Citar  
     

  10. #10  
    Iniciado
    Fecha de ingreso
    Jul 2010
    Mensajes
    26
    Descargas
    0
    Uploads
    0
    de acuerdo clarinetista, lo siento por colocar mi mail jeje, ya si eso le mando un privado.

    hckr está solucionado... escepto en tu ordenador que no chuta ni la versión que programé yo, ni algunas prefabricadas que te mandé, en tu ordenador simplemente no chuta y punto, habrá que ver si tienes las JRE instaladas y la versión de JDK que instalastes xD.
    Citar  
     

  11. #11  
    Moderador Global Avatar de hystd
    Fecha de ingreso
    Jul 2005
    Ubicación
    1, 11, 21, 1211...
    Mensajes
    1.596
    Descargas
    58
    Uploads
    0
    Intuyo que tu intención es hacer que el servidor sea capaz de atender varias conexiones de distintos clientes... ¿me equivoco?. Si es asi, entonces vayamos por partes...

    La idea consiste en hacer que el servidor se mantenga en un bucle infinito (un while(true)), como tu tienes, esperando a que se conecte un cliente, y en tal caso, crear un nuevo hilo en el servidor, para ese cliente, es decir, instanciar una clase que herede de Thread o implemente la interfaz Runnable, cosa que no veo en ese código.

    Así se me ocurre que pueden haber 3 clases: Servidor.java, Cliente.java e Hilo.java.

    Hilo.java
    Código:
    public class Hilo implements Runnable
    {
       public Hilo(Socket socket)
       {
          ...//tu constructor... con tus buffers.
       }
    
       public void run ()
       {
          while (true)
          {
             // Aqui pones el código para atender al cliente que se conecte.
             // Un read del buffer de entrada y un println para mostrar los datos recibidos.
          }
       }
    }
    Ahora en la clase servidor.java, te mantienes a la espera de que se conecte un nuevo cliente, y en caso de conexión, haces una instancia (te creas un objeto), de la clase hilo.java... algo así como:

    Servidor.java
    Código:
    public class Servidor
    {
       public Servidor()
       {
          ServerSocket miSocket = new ServerSocket(6789);
    
          while (true)
          {
              // Esperamos a un cliente
              Socket cliente = miSocket.accept();
    
              //cliente conectado. Creamos un objeto de la clase hilo.java
              Runnable miCliente = new Hilo(cliente);
              Thread hilo = new Thread(miCliente);
              hilo.start();       
          }
       }
    }
    Por último, el cliente 3/4 de lo mismo... En el constructor te creas los buffers de lectura y escritura y por cada petición, te creas un nuevo hilo.

    Cliente.java
    Código:
    public class Cliente implements Runnable
    {
       public Cliente(Socket socket){
                //creas los buffers de lectura y escritura.
                //creas un nuevo hilo para atender los datos que se reciban del socket.
                Thread hilo = new Thread(this);
                hilo.start();
       }
       public void run(){
            while (true)
            {
                //leer del buffer de entrada
                //mostrar el resultado
            }
    }
    Bueno, más o menos sería algo así el tratamiento de hilos en java para conseguir lo que "creo" que quieres conseguir...

    De todas maneras, tracear el código cuando se implementa algo, ayuda mucho en el desarrollo y en la depuración de errores.

    Un saludo.
    El optimista tiene ideas, el pesimista... excusas

    Citar  
     

  12. #12  
    Iniciado
    Fecha de ingreso
    Jul 2010
    Mensajes
    26
    Descargas
    0
    Uploads
    0
    Si!, es exáctamente eso lo que quería hacer, muy claro el código que planteas con muy pocas líneas y parece que me va a aclarar todo el asunto de los hilos x) (sólo lo he mirado por encima todavía pero se ve genial, bueno voy a mirarlo a fondo ahora). Muchas gracias por tus respuestas =D.

    Te mandé un privado con mi msn para que me agregases =).

    ------------------------------------------------EDITO---------------------------------------------------------------------------------

    Acabo de leer, compilar, y ejecutar el código. Me da el mismo problema por el que inicié pregunté acerca de los Thread jeje veamos estos son los códigos:

    Hilo:
    Código:
    import java.net.*;
    import java.io.*;
    
    public class Hilo implements Runnable {
    
        BufferedReader leerCliente;
        BufferedReader leerConsola;
        BufferedWriter escribirCliente;
    
        public Hilo(Socket socket) {
            try {
                
    	    leerCliente = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                leerConsola = new BufferedReader(new InputStreamReader(System.in));
                escribirCliente = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            } catch (IOException ioe) {
            }
        }
    
        public void run() {
           
    	 while (true) {
                try {
                   
    		String mensaje = leerConsola.readLine();
                    escribirCliente.write(mensaje);
                    mensaje = leerCliente.readLine();
                    System.out.println(mensaje);
                } catch (IOException ioe) {
                }
            }
        }
    }
    Servidor:
    Código:
    import java.net.*;
    import java.io.*;
    
    public class Servidor {
    
        public Servidor() {
            try {
                ServerSocket miSocket = new ServerSocket(6789);
    
                while (true) {
    
                    Socket cliente = miSocket.accept();
    
    
                    Runnable miCliente = new Hilo(cliente);
                    Thread hilo = new Thread(miCliente);
                    hilo.start();
                }
            } catch (IOException ioe) {
            }
        }
    
        public static void main(String args[]) {
    
            new Servidor();
        }
    }
    Cliente:
    Código:
     
    import java.net.*;
    import java.io.*;
    
    public class Cliente implements Runnable {
    
        BufferedReader leerServidor;
        BufferedReader leerConsola;
        BufferedWriter escribirServidor;
        Socket socket;
    
        public Cliente(String ip, int puerto) {
    
            try {
                
    	    socket = new Socket(ip, puerto);
                leerServidor = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                leerConsola = new BufferedReader(new InputStreamReader(System.in));
                escribirServidor = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            } catch (IOException ioe) {
            }
            Thread hilo = new Thread(this);
            hilo.start();
        }
    
        public void run() {
            
    	while (true) {
                try {
                    String mensaje = leerConsola.readLine();
                    escribirServidor.write(mensaje);
                    mensaje = leerServidor.readLine();
                    System.out.println(mensaje);
                } catch (IOException ioe) {
                }
            }
        }
    
        public static void main(String args[]) {
            new Cliente("localhost", 6789);
        }
    }
    Y se bloquea, simplemente no me deja escribir en la consola ni pulsar intro ni nada, es como si los socket no sirviesen de nada y los thread sólo congelasen el programa, no lo consigo hacer bien >_<.
    Última edición por -Localhost-; 29-07-2010 a las 07:35
    Citar  
     

  13. #13  
    Moderador Global
    Fecha de ingreso
    Aug 2005
    Mensajes
    6.279
    Descargas
    7
    Uploads
    0
    Prueba a arrancar una herramienta de monitorización de tráfico (i.e. Wireshark) para ver qué datos están viajando por la red realmente y tener así una pista de dónde está el fallo.


    Salu2

    . . . . . . . . . . . . . . . . . . . .
    [[ NORMAS DEL FORO ]]
    . . . . . . . . . . . . . . . . . . . .
    __________
    Citar  
     

  14. #14  
    Iniciado
    Fecha de ingreso
    Jul 2010
    Mensajes
    26
    Descargas
    0
    Uploads
    0
    Bueno, el problema no es con los paquetes, sino con los Thread xD, comprobé que al cerrar la sesión algunos mensajes que haya leído pues los recibe el cliente o el servidor (depende de lo que hayas cerrado) pero antes de eso los Thread lo tienen todo bloqueado.
    Citar  
     

Temas similares

  1. Respuestas: 6
    Último mensaje: 19-06-2014, 18:28
  2. Conexión remota
    Por ferprat en el foro GENERAL
    Respuestas: 4
    Último mensaje: 05-06-2007, 02:11
  3. Conexion remota de una tarjeta pico2000 pasando por Router
    Por patoos en el foro REDES Y TECNOLOGIAS WIRELESS
    Respuestas: 3
    Último mensaje: 06-07-2006, 22:08
  4. conexion remota
    Por josuak en el foro INGENIERIA INVERSA
    Respuestas: 2
    Último mensaje: 31-01-2004, 05:17
  5. conexion remota
    Por meg2410 en el foro APLICACIONES
    Respuestas: 6
    Último mensaje: 24-05-2002, 05:55

Marcadores

Marcadores