Arquitecturas cliente/servidor

Anuncio
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
Descargar