miércoles, 22 de abril de 2015

DatagramPacket y DatagramSocket

Programando en Java me he encontrado varios problemas para establecer conexión entre equipos tenemos dos opciones Socket y DatagramSocket , que uno es por medio de TCP y UDP. Haré un FAQ o una lista de problemas que me han surgido y su solución , también comentaré DatagramPacket , que es para enviar los paquetes por el canal creado gracias al DatagramSocket :


Problema 1.- java.net.BindException: No se puede asignar la dirección solicitada

Solución asignar el puerto correcto yo por equivocación asigné el 58000 , pero había que asignar el 8080, que por wikipedia podemos ver que esta sin asignación.
.... 
int port = 8080;
....
DatagramSocket dS = new DatagramSocket(null);
dS.setReuseAddress(true);
ds.bind(new InetSocketAddress(IP_emisor,port));
....
Problema 2.- java.net.BindException: Permiso denegado
Problema 3.- Java.net.BindException : Already bound

Estos problemas se solucionan poniendo de forma correcta la cosntrucción del DatagramSocket y DatagramPacket :
String IP_envio = "";
int port = 8080;
DatagramSocket dS = new DatagramSocket(null);
dS.setReuseAddress(true);
DatagramPacet dP = new DatagramPacket(buff,buff.length, InetAddress.getByName(IP_envio) ,port); 
dS.send(dP); 
Esto no está ordenado , pero en general quedaría de la siguiente manera :
try {
   try {
   DatagramSocket dS = new DatagramSocket(null);
   
   dS.setReuseAddress(true);
  
   DatagramPacket dP = null;
    
   synchronized(recepcionNodos.class){
    try {
     dP = new DatagramPacket(tablaEnca , tablaEnca.length, InetAddress.getByName(IP_envio)  , port); 
        dS.send(dP);
        System.out.println("Paquete enviado");
    } catch (UnknownHostException e) {
     e.printStackTrace();
    } catch (IOException e){
     e.printStackTrace();
    }
    try {
     dS.send(dP);
    } catch (IOException e) {
     e.printStackTrace();
    } 
   }
  } catch (SocketException e) {
   e.printStackTrace();
  }

Como crearlos 

Nos encontramos que para instanciar estas classes en nuestros respectivos proyectos tenemos que hacer lo siguiente :
DatagramSocket dS = new DatagramSocket(null);
Esto lo que hace es crear el DatagramSocket por defecto , ya que podemos poner nosotros el puerto pero eso nos generará problemas innecesarios desde mi punto de vista.
dS.setReuseAddress(true);

Esto nos permitirá usar un socket por más de una conexión UDP , por ejemplo si tenemos varias IP's creadas en nuestra interfaz y en el programa solo queremos que use un puerto , pues con esto logramos que todas esas IP's credas usen dicho puerto UDP , sin problema y no nos comente , que el puerto ya esta en uso.

dP = new DatagramPacket(tablaEnca , tablaEnca.length, InetAddress.getByName(IP_envio)  , port);
Sigue el formato de :
DatagramPacket dP = new DatagramPacket (buff , buff.length, IP , puerto);

No hay comentarios:

Publicar un comentario