socket cliente sevidor

36
Arquitecturas cliente/servidor Creación de Sockets Cliente Servidor Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

Upload: anonymous-zymamu

Post on 05-Dec-2015

70 views

Category:

Documents


1 download

DESCRIPTION

Apuntes

TRANSCRIPT

Page 1: Socket Cliente Sevidor

Arquitecturas cliente/servidor

Creación de Sockets Cliente Servidor

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

Page 2: Socket Cliente Sevidor

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

Page 3: Socket Cliente Sevidor

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

Page 4: Socket Cliente Sevidor

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

Page 5: Socket Cliente Sevidor

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

Page 6: Socket Cliente Sevidor

Sockets TCP

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

Page 7: Socket Cliente Sevidor

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

Page 8: Socket Cliente Sevidor

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

Page 9: Socket Cliente Sevidor

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

Page 10: Socket Cliente Sevidor

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

Page 11: Socket Cliente Sevidor

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

Page 12: Socket Cliente Sevidor

Modelo cliente/servidor

• Modelo general

SERVIDOR CLIENTE

ServerSocket(port#) Socket(host,port#)

accept()

............ ............

InputStream OutputStream

OutputStream InputStream

............ ............

close() close()

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

Page 13: Socket Cliente Sevidor

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

Page 14: Socket Cliente Sevidor

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

Page 15: Socket Cliente Sevidor

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

Page 16: Socket Cliente Sevidor

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

Page 17: Socket Cliente Sevidor

InputStream & Output Stream

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

Page 18: Socket Cliente Sevidor

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

Page 19: Socket Cliente Sevidor

Interacción cliente/servidor: TCP

wait for incoming

connection request connectionSocket =

serverSocket.accept()

create socket, port=x, for

incoming request: serverSocket =

ServerSocket()

create socket, connect to hostid, port=x clientSocket =

Socket()

close

connectionSocket

read reply from

clientSocket

close

clientSocket

Servidor (corriendo en IP hostid) Cliente

send request using

clientSocket read request from

connectionSocket

write reply to

connectionSocket

TCP connection setup

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

Page 20: Socket Cliente Sevidor

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

Page 21: Socket Cliente Sevidor

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

Page 22: Socket Cliente Sevidor

Ciclo de vida de un socket TCP

Ciclo de vida del cliente TCP

Ciclo de vida del servidor TCP

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

Page 23: Socket Cliente Sevidor

Sockets UDP

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

Page 24: Socket Cliente Sevidor

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

Page 25: Socket Cliente Sevidor

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

Page 26: Socket Cliente Sevidor

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

Page 27: Socket Cliente Sevidor

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

Page 28: Socket Cliente Sevidor

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

Page 29: Socket Cliente Sevidor

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

Page 30: Socket Cliente Sevidor

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. En Java accedemos a las distintas partes de un datagrama mediante los métodos de la clase java.net.DatagramPacket.

cabecera cuerpo

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

Page 31: Socket Cliente Sevidor

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

Page 32: Socket Cliente Sevidor

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

Page 33: Socket Cliente Sevidor

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

Page 34: Socket Cliente Sevidor

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

Page 35: Socket Cliente Sevidor

Interacción cliente/servidor: UDP

close

clientSocket

Servidor (corriendo en host)

read reply from

clientSocket

create socket,

clientSocket =

DatagramSocket()

Cliente

Create, address (hostid, port=x,

send datagram request

using clientSocket

create socket, port=x, for

incoming request: serverSocket =

DatagramSocket()

read request from

serverSocket

write reply to

serverSocket

specifying client

host address,

port number

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

Page 36: Socket Cliente Sevidor

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