Hola a todos, hoy os explicaré como podemos crear una conexión UDP en Java.
Gracias a los sockets, podemos conectarnos a otras maquinas y realizar el patrón de cliente/servidor, que nos permite por ejemplo mandar mensajes entre 2 maquinas distintas.
La conexión UDP no es orientada a conexión, es decir, el servidor en principio no sabe de donde viene el mensaje, aunque lo puede saber mirando el datagrama que le llega. En otras palabras y comparando con la conexión TCP, UDP no necesita saber quien se conecta a él.
En UDP se envían datagramas a modo de mensajes.
El código puede estar en el mismo proyecto para probar.
Código del cliente
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import java.util.logging.Level; import java.util.logging.Logger; public class Cliente { public static void main(String[] args) { //puerto del servidor final int PUERTO_SERVIDOR = 5000; //buffer donde se almacenara los mensajes byte[] buffer = new byte[1024]; try { //Obtengo la localizacion de localhost InetAddress direccionServidor = InetAddress.getByName("localhost"); //Creo el socket de UDP DatagramSocket socketUDP = new DatagramSocket(); String mensaje = "¡Hola mundo desde el cliente!"; //Convierto el mensaje a bytes buffer = mensaje.getBytes(); //Creo un datagrama DatagramPacket pregunta = new DatagramPacket(buffer, buffer.length, direccionServidor, PUERTO_SERVIDOR); //Lo envio con send System.out.println("Envio el datagrama"); socketUDP.send(pregunta); //Preparo la respuesta DatagramPacket peticion = new DatagramPacket(buffer, buffer.length); //Recibo la respuesta socketUDP.receive(peticion); System.out.println("Recibo la peticion"); //Cojo los datos y lo muestro mensaje = new String(peticion.getData()); System.out.println(mensaje); //cierro el socket socketUDP.close(); } catch (SocketException ex) { Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex); } catch (UnknownHostException ex) { Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex); } } } |
Código del servidor
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.util.logging.Level; import java.util.logging.Logger; public class Servidor { public static void main(String[] args) { final int PUERTO = 5000; byte[] buffer = new byte[1024]; try { System.out.println("Iniciado el servidor UDP"); //Creacion del socket DatagramSocket socketUDP = new DatagramSocket(PUERTO); //Siempre atendera peticiones while (true) { //Preparo la respuesta DatagramPacket peticion = new DatagramPacket(buffer, buffer.length); //Recibo el datagrama socketUDP.receive(peticion); System.out.println("Recibo la informacion del cliente"); //Convierto lo recibido y mostrar el mensaje String mensaje = new String(peticion.getData()); System.out.println(mensaje); //Obtengo el puerto y la direccion de origen //Sino se quiere responder, no es necesario int puertoCliente = peticion.getPort(); InetAddress direccion = peticion.getAddress(); mensaje = "¡Hola mundo desde el servidor!"; buffer = mensaje.getBytes(); //creo el datagrama DatagramPacket respuesta = new DatagramPacket(buffer, buffer.length, direccion, puertoCliente); //Envio la información System.out.println("Envio la informacion del cliente"); socketUDP.send(respuesta); } } catch (SocketException ex) { Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex); } } } |
Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.
Deja una respuesta