[Sockets] Sirven en internet?

Iniciado por klaine, 2 Diciembre 2011, 21:07 PM

0 Miembros y 2 Visitantes están viendo este tema.

klaine

Hola, estuve viendo unos videotutoriales que me paso un amigo, el tipo se llama nikitus y enseña a crear una conexion con sockets, en el video muestra como hacer un pequeño xat, todo el codigo funka, pero me gustaria saber si es posible hacer que funke en internet, traté de poner mi direccion ip en el programa cliente y pasarselo a un amigo, pero no funciono, codeé en base al video, dos clases, un cliente y un server, en localhost corre bien, pero me gustaría saber, si es posible, que debo cambiarle para que funcione en internet, de antemano gracias.

Clase servidor:

Código (java) [Seleccionar]


import java.net.ServerSocket;
import java.net.Socket;
import java.io.ObjectOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import javax.swing.JOptionPane;

public class XServer {

  private ServerSocket ss;
private Socket s;
private ObjectOutputStream oos;
private boolean isRunning=true;
private ObjectInputStream ois;
private volatile Command cmd=null;


    XServer(){

          try{

     ss = new ServerSocket(9999);
     s = ss.accept();
     oos=new ObjectOutputStream(s.getOutputStream());
     ois=new ObjectInputStream(s.getInputStream());

     }catch(IOException ioex){

      ioex.printStackTrace();

     }

this.sender();
this.receiver();
this.dealReceive();
this.autoClose();

    }

    void sender(){

Thread t=new Thread(new Runnable(){

  public void run(){

   while(XServer.this.isRunning){

    int type=0;

    try{

  String msg=JOptionPane.showInputDialog("Mensaje para el Cliente");

   Command c=new Command();

   c.setMsg(msg);

   type=(msg.equalsIgnoreCase("Close"))? 0:1;

   c.setType(type);

   oos.writeObject(c);

  }catch(IOException ex) {

   ex.printStackTrace();

  }

    if(type==0){

     break;

    }

   }

  }

});

t.start();

    }

    void receiver(){

    Thread t=new Thread(new Runnable(){

     public void run(){

      while(XServer.this.isRunning){

        try{

      Thread.sleep(1000);

      Object aux=ois.readObject();

      if(aux!=null && aux instanceof Command){

        XServer.this.cmd = (Command) aux;

      }

     }catch(InterruptedException intex){

      intex.printStackTrace();

     }catch(IOException ioex){

      ioex.printStackTrace();

     }catch(ClassNotFoundException classex){

      classex.printStackTrace();

     }

      }

     }

    });

    t.start();

    }

    void dealReceive(){

     Thread t=new Thread(new Runnable(){

      public void run(){

       while(XServer.this.isRunning){

       try{

        Thread.sleep(1000);

        Command c=XServer.this.cmd;

        if(c.getType().equals("Message")){

         System.out.println(c.getMsg());

        }else if(c.getType().equals("Action") && c.getMsg().equals("Close")){

         XServer.this.isRunning=false;

        }

     }catch(InterruptedException intex){

      intex.printStackTrace();

     }catch(NullPointerException nullex){

     }finally{

       XServer.this.cmd=null;

     }

     }

      }

     });

     t.start();

    }

    void autoClose(){

Thread t=new Thread(new Runnable(){

  public void run(){

   while(true){

    try{

     Thread.sleep(200);

     if(!XServer.this.isRunning){

      XServer.this.ois.close();
      XServer.this.oos.close();
      XServer.this.s.close();

     }

    }catch(InterruptedException intex){

     intex.printStackTrace();

    }catch(IOException ioex){

     ioex.printStackTrace();

    }

   }

  }

});

t.start();

}

}




Clase cliente:

Código (java) [Seleccionar]


import java.net.Socket;
import java.io.ObjectOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import javax.swing.JOptionPane;

public class XClient {

  private Socket s;
private ObjectOutputStream oos;
private boolean isRunning=true;
private ObjectInputStream ois;
private volatile Command cmd=null;


    XClient(){

               try{

     s=new Socket("10.5.4.124", 9999);
     oos=new ObjectOutputStream(s.getOutputStream());
     ois=new ObjectInputStream(s.getInputStream());

     }catch(IOException ioex){

      ioex.printStackTrace();

     }

               this.sender();
               this.receiver();
               this.dealReceive();
               this.autoClose();

    }

    void receiver(){

    Thread t=new Thread(new Runnable(){

     public void run(){

      while(XClient.this.isRunning){

        try{

      Thread.sleep(1000);

      Object aux=ois.readObject();

      if(aux!=null && aux instanceof Command){

        XClient.this.cmd = (Command) aux;

      }

     }catch(InterruptedException intex){

      intex.printStackTrace();

     }catch(IOException ioex){

      ioex.printStackTrace();

     }catch(ClassNotFoundException classex){

      classex.printStackTrace();

     }

      }

     }

    });

    t.start();

    }

        void dealReceive(){

     Thread t=new Thread(new Runnable(){

      public void run(){

       while(XClient.this.isRunning){

       try{

        Thread.sleep(1000);

        Command c=XClient.this.cmd;

        if(c.getType().equals("Message")){

         System.out.println(c.getMsg());

        }else if(c.getType().equals("Action") && c.getMsg().equals("Close")){

         XClient.this.isRunning=false;

        }

     }catch(InterruptedException intex){

      intex.printStackTrace();

     }catch(NullPointerException nullex){

     }finally{

       XClient.this.cmd=null;

     }

     }

      }

     });

     t.start();

    }

void sender(){

Thread t=new Thread(new Runnable(){

  public void run(){

   while(XClient.this.isRunning){

    int type=0;

    try{

  String msg=JOptionPane.showInputDialog("Mensaje para el Server");

   Command c=new Command();

   c.setMsg(msg);

   type=(msg.equalsIgnoreCase("Close"))? 0:1;

   c.setType(type);

   oos.writeObject(c);

  }catch(IOException ex) {

   ex.printStackTrace();

  }

    if(type==0){

     break;

    }

   }

  }

});

t.start();

    }

void autoClose(){

Thread t=new Thread(new Runnable(){

  public void run(){

   while(true){

    try{

     Thread.sleep(200);
     
     if(!XClient.this.isRunning){

      XClient.this.ois.close();
      XClient.this.oos.close();
      XClient.this.s.close();

     }

    }catch(InterruptedException intex){

     intex.printStackTrace();

    }catch(IOException ioex){

     ioex.printStackTrace();

    }

   }

  }

});

t.start();

}

}



Se me olvidaba, para lo que quiero hacer despues de aprender a manipular sockets en internet creé una clase comando, que en el futuro me servirá para mandar solo strings con referencias a lo que se debe hacer y no mandar objetos pesados a traves de la conexion, esta es la clase:

Código (java) [Seleccionar]


import java.io.Serializable;

public class Command implements Serializable{

private String[] types={"Action", "Message", "Dialog", "Input", "Warning", "Error"};
private String[] actions={"Close"};

private String type="";
private String msg="";

    Command(){

     this.type= types[1];

    }

    Command(String msg){

     this.type=this.types[0];
     this.msg=msg;

    }

    Command(String msg, int type){

     this.type=this.types[type];
     this.msg=msg;

    }

public String getMsg() {
  return msg;
}

void setDialog(String msg){

  this.msg=msg;
  this.type=types[2];
 
}

void setInput(String msg){

  this.msg=msg;
  this.type=types[3];

}

void setWarning(String msg){

  this.msg=msg;
  this.type=types[4];

}

void setError(String msg){

  this.msg=msg;
  this.type=types[5];

}

public void setMsg(String msg) {
  this.msg = msg;
}

public void setType(int i){

  this.type=this.types[i];

}

public String getType(){

  return this.type;

}



}





Bueno, de antemano agradezco muchísimo vuestras respuestas, saludos

RyogiShiki

No he visto el código, pero las conexiones entre sockets del tipo peer to peer suelen estar bastante liadas si alguno de los dos está detrás de un Firewall o un Router. Si la conexión es directa y no estás usando ningún puerto reservado seguro que va de las mil maravillas.

Saludos


Pablo Videla

Interesante, gracias por publicar el codigo, voy a revisarlo mas tarde y te cuento, saludos!

klaine

Olvide poner el main, aunque no hace mucho:

Código (java) [Seleccionar]


public class Main {

    public static void main(String[] args) {

     //xserver();
     //xclient();

    }

}



Para probarlo en localhost, primero se conecta como server, luego como client (sacando los respectivos comentarios) y en la linea 22 de XClient el primer argumento es "localhost", esta es mi duda, que debo poner en localhost, por que al hacer ipconfig, me salen un monton de numeros y el amigo que recibio el jar cliente ya no esta conectado Xd (la conexion aqui en mi instituto es ipv6, ¿sera por eso?  ojalá que no :-\)

Saludos!

Pablo Videla

Si tu eres el servidor coloca tu ip

http://whatismyipaddress.com/

ahi la ves, y el cliente colocara su propia ip,  :xD cualquier error alguien me corrige, saludos.

klaine

Puse la ip que sale en es pagina, el chico al que le pedi que ejecutara el cliente me dijo lo siguiente:

"ahora si abrio algo­­ y dije hola­­"

No se si creerle, pero si es cierto algo anda mal en mi code, si es mentira quizas sea algo mas que haya que hacer.


Pablo Videla

Cita de: klaine en  2 Diciembre 2011, 23:16 PM
Puse la ip que sale en es pagina, el chico al que le pedi que ejecutara el cliente me dijo lo siguiente:

"ahora si abrio algo­­ y dije hola­­"

No se si creerle, pero si es cierto algo anda mal en mi code, si es mentira quizas sea algo mas que haya que hacer.



Y por que crees que te mintio?

egyware

Cuando uno está detras de un Router es imposible abrir puertos. Si estás detras de un router o firewall o lo que sea, trata de desbloquearlo primero y luego te pones a la escucha en tales puertos.
Si estas directamente conectado a internet no deberias tener problemas en ponerte a la escucha en ningun puerto (cuidado con el firewall)

Saludos!!!

Chivin

Ola como mencionan los compañeros, los más seguro es que estas tras un firewall o un router quien(es) probablemente (por no afirmarlo) tiene cerrado el puerto que estas utilizando. Es por ello que no permite la comunicación, para hacer la conexión es necesario el pase por esas barreras de lo contrario jamás se conectarán. El problema no tiene que ver con IPv6.

saludos!!