Arquitecturas cliente/servidor

Anuncio
Arquitecturas cliente/servidor
Creación de Sockets Cliente Servidor
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Creación de Sockets Cliente/Servidor
• Sockets en TCP
• Sockets en UDP
• Definición de DAEMON
• Concepto de Hilos
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Qué es un socket?
• Un socket es un punto final de un enlace de
comunicación de dos vías entre dos
programas que se ejecutan a través de la red.
• El cliente y el servidor deben ponerse de
acuerdo sobre el protocolo que utilizarán.
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Familias de sockets
Es una constante de la API de Berkeley que indica que tipo de
Protocolo se va utilizar durante una conexión
• Familia AF_UNIX: Usa protocolos internos de Unix.
• Familia AF_INET: Usa protocolos de Internet, como el TCP
(Transmisión Control Protocol).
• Familia AF_CCITT: Norma X.25 de CCITT.
• Familia AF_NS: Protocolos NS de XEROX.
• Familia AF_SNA: Protocolos IBM SNA.
• Entre otras…..
También se puede encontrar como PF_* (Protocol Family)
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Referencia API de sockets en C
• Circuito virtual: Mediante la búsqueda de
enlaces libres, se establece un circuito virtual.
Conexión permanente hasta el final de la
comunicación. SOCK_STREAM
• Datagramas: no trabajan con circuitos
permanentes. La transmisión se realiza a nivel
de paquetes. SOCK_DGRAM
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Sockets TCP
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Orientado a Conexión
• Establece un camino virtual entre servidor y cliente,
fiable, sin pérdidas de información ni duplicados, la
información llega en el mismo orden que se envía.
• El cliente abre una sesión en el servidor y este guarda
un estado del cliente.
– El cliente utiliza la clase Socket
– El servidor utiliza la clase ServerSocket
– Estas clases se encuentran definidas en el paquete java.net
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Clase Socket
Constructores:
public Socket ()
public Socket (InetAddress address, int port)
public Socket (String host, int port)
public Socket (InetAddress address, int port, InetAddress localAddr, int
localPort)
public Socket (String host, int portt, InetAddress localAddr, int localPort)
address / localAddr Dirección IP de la máquina remota /local.
port / localPort
Puerto de la máquina remota / local.
host
Nombre de la máquina remota
Nota: En el caso del primer constructor se crea un objeto Socket sin
conexión.
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
•
Servicios de la clase Socket
public InetAddress getInetAddress()
– Devuelve la dirección IP de la máquina en la que estamos conectados.
•
public int getPort()
– Devuelve el puerto de la máquina remota.
•
public void close()
– Cierra el canal de comunicación.
•
public InputStream getInputStream()
– Devuelve el canal de lectura del socket.
•
public OutputStream getOutputStream()
– Devuelve el canal de escritura del socket.
•
Ademas JAVA proporciona dos llamadas para saber la @IP y puerto local
(getLocalAddress() y getLocalPort())
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Clase ServerSocket
• Constructores:
public ServerSocket (int port)
public ServerSocket (int port, int backlog)
public ServerSocket (int port, int backlog, InetAddress bindAddr)
port
puerto de escucha de la máquina servidora.
backlog tamaño de la cola de espera, en el primero es 50.
bindAddr dirección IP local que se hará pública mediante el bind.
• El constructor ServerSocket se encarga de hacer el bind y el listen.
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Servicios de la clase ServerSocket
• public Socket accept()
– Devuelve el socket resultado de aceptar una petición, para
llevar a cabo la comunicación con el cliente.
• public void close()
– Cierra el canal de comunicación.
• public InetAddress getInetAddress()
– Devuelve la dirección IP de la máquina local.
• public int getLocalPort()
– Devuelve el puerto de la máquina local
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Modelo cliente/servidor
• Modelo general
SERVIDOR
ServerSocket(port#)
accept()
............
InputStream
OutputStream
............
close()
CLIENTE
Socket(host,port#)
............
OutputStream
InputStream
............
close()
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Creación de objetos
Conexión servidor
ServerSocket miServicio;
try{
miServicio = new ServerSocket(numeroPuerto);
} catch ( IOException e ) {
System.out.println ( e );
}
.......
Socket socketServicio = null;
try{
socketServicio = miServicio.accept();
} catch ( IOException e ) {
System.out.println ( e );
}
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Creación de objetos (2)
Conexión cliente
Socket miCliente;
try{
miCliente = new Socket(“maquina”,numeroPuerto);
} catch ( IOException e ) {
System.out.println ( e );
}
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Creación de Objetos Stream
Creación Streams de entrada
•
A pesar de haber creado el socket, el programa no puede enviar o recibir datos a
traves de esta clase. Se utilizan los InputStream y el OutputStream
DataInputStream entrada; (--- CLIENTE ---)
try {
entrada = new DataInputStream( miCliente.getInputStream() );
} catch ( IOException e ) {
System.out.println ( e );
}
DataInputStream entrada; (--- SERVIDOR ---)
try {
entrada = new DataInputStream(socketServicio.getInputStream() );
} catch ( IOException e ) {
System.out.println ( e );
}
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Creación de Objetos Stream
Creación Streams salida
PrintStream salida; (--- CLIENTE y SERVIDOR ---)
try {
salida = new PrintStream( miCliente.getOutputStream() );
} catch ( IOException e ) {
System.out.println ( e );
}
DataOutputStream salida; (--- CLIENTE y SERVIDOR ---)
try {
salida = new DataOutputStream(miCliente.getOutputStream() );
} catch ( IOException e ) {
System.out.println ( e );
}
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
InputStream &
Output Stream
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Comunicación entre cliente/servidor
• Para la transmisión de datos entre cliente y servidor se utilizan las
clases DataInputStream (recibir datos) y DataOutputStream (enviar
datos)
• Estas clases disponen de métodos para leer y escribir
• datos en el socket:
–
–
–
–
–
read/write Boolean
read/write Char
read/write Double, read/write Float, read/write Int,
read/write Long, read/write Short
read/writeUTF (leer/escribir cadenas de caracteres)
• Para envíar los datos se utiliza el método flush() de la clase
DataOutputStream.
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Interacción cliente/servidor: TCP
Servidor (corriendo en IP hostid)
Cliente
create socket,
port=x, for
incoming request:
serverSocket =
ServerSocket()
TCP
wait for incoming
connection request connection
connectionSocket =
serverSocket.accept()
setup
read request from
connectionSocket
write reply to
connectionSocket
close
connectionSocket
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
create socket,
connect to hostid, port=x
clientSocket =
Socket()
send request using
clientSocket
read reply from
clientSocket
close
clientSocket
import java.io.*;
import java.net.*;
public class SimpleEchoServer{
public static void main(String[] args) {
try{
ServerSocket s = new ServerSocket(9999);
String str;
while (true){
Socket c = s.accept();
InputStream i =
c.getInputStream();
OutputStream o =
c.getOutputStream();
do{
byte[] line = new byte[100];
i.read(line);
o.write(line);
str = new String(line);
}while ( !str.trim().equals("bye") );
c.close();
}
}catch (Exception err){
System.err.println(err);
}
}
}
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
import java.net.*;
import java.io.*;
public class SimpleEchoClient{
public static void main(String[] args) {
try{
Socket s = new Socket("127.0.0.1", 9999);
InputStream i = s.getInputStream();
OutputStream o =
s.getOutputStream();
String str;
do{
byte[] line = new byte[100];
System.in.read(line);
o.write(line);
i.read(line);
str = new String(line);
System.out.println(“local: ”+str.trim());
}while ( !str.trim().equals("bye") );
s.close();
}catch (Exception err){
System.err.println(err);
}
}
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Ciclo de vida de un socket TCP
Ciclo de vida
del servidor TCP
Ciclo de vida del
cliente TCP
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
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
Clase InetAddress
La forma de crear un objeto InetAddress es
mediante el método estático:
InetAddress.getByName(String host)
Recibe un nombre de host en notación alfanumérica (por
ejemplo "www.etsit.upv.es" o "209.41.57.70" )
devuelve un objeto InetAddress con esa dirección.
Si la dirección no existe o no puede ser encontrada, este
método lanza una excepción UnknownHostException.
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza
Descargar