Sockets UDP y broadcast

De ChuWiki
Saltar a: navegación, buscar

Sockets UDP/IP

En java podemos enviar mensajes con el protocolo UDP/IP. En este protocolo no hay una conexión real entre un cliente y un servidor. Simplemente uno de ellos envía un mensaje, independientemente de que el otro esté o no a la escucha, incluso es posible enviarlo aunque el otro ni siquera esté arrancado. Ese mensaje, por tanto, puede perderse y no hay seguridad de que se reciba al otro lado.

Envío por UDP/IP

El siguiente trozo de código envía un mensaje por UDP/IP hacia un destinatario que puede o no estar.

DatagramSocket enviador = new DatagramSocket();

// El dato a enviar, como array de bytes.
byte [] dato = new byte [] {1,2,3,4};

// El destinatario es 192.20.20.21 y se hace el envío por el puerto 55557
DatagramPacket dgp = new DatagramPacket(dato, dato.length, InetAddress.getByName("193.20.20.21"), 55557);

// envío del paquete			
enviador.send(dgp);


Recepción por UPD/IP

En el código del que quiere recibir el mensaje, debemos poner esto

// Puerto por el que queremos escuchar 55557
DatagramSocket escucha = new DatagramSocket(55557);

// Un array de bytes lo suficientemente grande para contener
// cualquier dato que podamos recibir.
byte [] dato = new byte [1024];

DatagramPacket dgp = new DatagramPacket(dato, dato.length);

// La llamada se queda bloqueada hasta que recibamos algún
// mensaje por ese puerto 55557
escucha.receive(dgp);

// En datos obtenemos lo que acabamos de recibir.
byte[] datos = dgp.getData();

Broadcast

También se puede enviar un mensaje sin destinatario concreto, es decir, para cualquiera que quiera leerlo. Para ello se puede usar la dirección de Broadcast de la red en la que estemos, habitualmente terminada en 255, según la máscara de red.

Por ejemplo, si nuestra IP es 193.20.20.21 y nuestra máscara de red es 255.255.255.0, la dirección de broacast será 193.20.20.255, es decir, reemplazando por 255 aquellos números que en la máscara de red tienen 0.

El código para enviar es igual que el anterior, salvo por dos detalles que se comentan

DatagramSocket enviador = new DatagramSocket();

// Puede ser necesario habilitar el envío por broadcast.
enviador.setBroadcast(true);

byte [] dato = new byte [] {1,2,3,4};

// El destinatario es 192.20.20.255, que es la dirección de broadcast
DatagramPacket dgp = new DatagramPacket(dato, dato.length, InetAddress.getByName("193.20.20.255"), 55557);

enviador.send(dgp);


Enlaces