Sockets UDP Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza No orientado a conexión • Envío de datagramas de tamaño fijo. No es fiable, puede haber pérdidas de información y duplicados, y la información puede llegar en distinto orden del que se envía. • No se guarda ningún estado del cliente en el servidor, por ello, es más tolerante a fallos del sistema. • Tanto el cliente como el servidor utilizan la clase DatagramSocket. • Se encuentran en el paquete java.net Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza Clase Datagram Socket Constructores: public DatagramSocket () public DatagramSocket (int port) public DatagramSocket (int port, InetAddress laddr) port puerto de la máquina. laddr dirección IP local que se hará pública mediante el bind. El constructor DatagramSocket se encarga de hacer el bind. El primer constructor elige un puerto libre. Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza DatagramSocket Un objeto java.net.DatagramSocket es un conector a través del cual enviamos y recibimos paquetes UDP. Si se quiere utilizar un DatagramSocket para recibir paquetes se necesita especificar el puerto. Al contrario, si es para enviar paquetes, no es necesario especificar este puerto. Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza Ejemplo DatagramSocket ds1 = new DatagramSocket(123); /* Aquí usamos este DatagramSocket para recibir datos... */ /* ... */ /* Hemos terminado, cerramos el socket */ ds1.close(); DatagramSocket ds2 = new DatagramSocket(); /* Aquí lo usamos para transmitir datos... */ /* ... */ /* Hemos terminado, cerramos el socket */ ds2.close(); Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza Servicios de la clase DatagramSocket public void connect(InetAddress address, int port) Conecta el socket a la máquina remota con la @IP address y puerto port. public void close() Cierra el canal de comunicación. public InetAddress getInetAddress() Devuelve la @IP de la máquina remota. public int getPort() Devuelve el puerto de la máquina remota. También hay dos llamadas para saber la @IP y puerto local (getLocalAddress() y getLocalPort()). Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza DatagramSocket public void send ( DatagramPacket p): Envía un datagrama a la máquina remota, por el socket asociado. public void receive ( DatagramPacket p): Recibe un datagrama de otra máquina, por el socket asociado. Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza La clase DatagramPacket Esta clase representa a los paquetes de datos que vamos a recibir o transmitir a través de los objetos DatagramSocket. Estos paquetes constan de: cabecera dirección de origen, destino del paquete, el puerto, longitud del paquete, checksum, etc. cuerpo contenido real del paquete. cabecera En Java accedemos a las distintas partes de un datagrama mediante los métodos de la clase java.net.DatagramPacket. Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza cuerpo DatagramPacket La forma de construir datagramas es distinta dependiendo de si queremos enviar o recibir datos. En caso de que se quiera recibir, especificar: arreglo de bytes donde almacenar los datos longitud máxima que queremos recibir. Si queremos transmitir, especificar: arreglo de bytes a enviar longitud máxima datos a enviar dirección y puerto destino del datagrama. Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza Clase DatagramPacket Constructores public DatagramPacket (byte[] buff, int length) Construye un DatagramPacket para recibir paquetes en el buffer buff, de longitud length public DatagramPacket (byte[] buff, int length, InetAddress address, int port) Construye un DatagramPacket para envíar paquetes con datos del buffer buff, de longitud length, a la @IP address y el puerto port. Servicios: Para la actualización y consulta de los diferentes campos de un DatagramPacket disponemos de los siguientes métodos: set/getAddress, set/getData, set/getLength, set/getPort Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza Enviar datos int tam = 1024; InetAddress direcc = ...; byte[] datos = new byte[tam]; int puerto = 543; for (int n=0;n<tam;n++){ /* Generamos los datos que vamos a enviar */ datos[n] = ...; } DatagramSocket ds = new DatagramSocket(); DatagramPacket dp = new DatagramPacket(datos, tam, direcc, puerto); ds.send(dp); /* Aquí enviamos el paquete */ Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza Recibir datos int tam = 1024; byte[] buffer = new byte[tam]; int puerto = 987; DatagramSocket ds = new DatagramSocket(puerto); DatagramPacket dp = new DatagramPacket(buffer,tam); ds.receive(dp); /*Ahora tenemos en buffer la información que nos interesa*/ Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza Interacción cliente/servidor: UDP Servidor (corriendo en host) create socket, port=x, for incoming request: serverSocket = DatagramSocket() read request from serverSocket write reply to serverSocket specifying client host address, port number Cliente create socket, clientSocket = DatagramSocket() Create, address (hostid, port=x, send datagram request using clientSocket read reply from clientSocket close clientSocket Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza