Arquitecturas Cliente/servidor - UNAM

Transcription

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.Yasmine Macedo RezaARQUITECTURASCLIENTE/SERVIDORCreación de Sockets Cliente Servidor

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaCreación de Sockets Cliente/Servidor Sockets en TCP Definición de DAEMON Concepto de Hilos Sockets en UDP

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaQué es un socket? Un socket es un punto final de un enlace de comunicaciónde dos vías entre dos programas que se ejecutan a travésde la red. El cliente y el servidor deben ponerse de acuerdo sobre elprotocolo que utilizarán.

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaFamilias de socketsEs una constante de la API de Berkeley que indica que tipode 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 2016-1 M.I.YasmineMacedo RezaReferencia API de sockets en C Circuito virtual: Mediante la búsqueda de enlaces libres,se establece un circuito virtual. Conexión permanentehasta el final de la comunicación. SOCK STREAM Datagramas: no trabajan con circuitos permanentes. Latransmisión se realiza a nivel de paquetes.SOCK DGRAM

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaSOCKETS TCPArquitecturas Cliente/Servidor, Sem2015-1 M.I.Yasmine Macedo Reza

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaOrientado a Conexión Establece un camino virtual entre servidor y cliente,fiable, sin pérdidas de información ni duplicados, lainformación llega en el mismo orden que se envía. El cliente abre una sesión en el servidor y este guarda unestado 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 2016-1 M.I.YasmineMacedo RezaClase SocketConstructores:public Socket ()public Socket (InetAddress address, int port)public Socket (String host, int port)public Socket (InetAddress address, int port, InetAddress localAddr, intlocalPort)public Socket (String host, int portt, InetAddress localAddr, int localPort)address / localAddrport / localPorthostDirección IP de la máquina remota /local.Puerto de la máquina remota / local.Nombre de la máquina remotaNota: En el caso del primer constructor se crea un objeto Socket sinconexión.

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaServiciosdelaclaseSocket 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 puertolocal (getLocalAddress() y getLocalPort())

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaClase ServerSocket Constructores:public ServerSocket (int port)public ServerSocket (int port, int backlog)public ServerSocket (int port, int backlog, InetAddress bindAddr)portpuerto 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 2016-1 M.I.YasmineMacedo RezaServicios de la clase ServerSocket public Socket accept() Devuelve el socket resultado de aceptar una petición, para llevar acabo 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 2016-1 M.I.YasmineMacedo RezaModelo cliente/servidor Modelo OutputStreamInputStream.close()

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaCreación de objetosConexión servidorServerSocket 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 2016-1 M.I.YasmineMacedo RezaCreación de objetos (2)Conexión clienteSocket miCliente;try{miCliente new Socket(“maquina”,numeroPuerto);} catch ( IOException e ) {System.out.println ( e );}

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaCreación de Objetos StreamCreación Streams de entrada A pesar de haber creado el socket, el programa no puede enviar o recibirdatos a traves de esta clase. Se utilizan los InputStream y el OutputStreamDataInputStream 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 2016-1 M.I.YasmineMacedo RezaCreación de Objetos StreamCreación Streams salidaPrintStream 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 2016-1 M.I.YasmineMacedo RezaInputStream &Output Stream

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaComunicación entre cliente/servidor Para la transmisión de datos entre cliente y servidor se utilizanlas 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 claseDataOutputStream.

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaInteracción cliente/servidor: TCPServidor (corriendo en IP hostid)Clientecreate socket,port x, forincoming request:serverSocket ServerSocket()TCPwait for incomingconnection request connectionconnectionSocket serverSocket.accept()read request fromconnectionSocketwrite reply toconnectionSocketcloseconnectionSocketsetupcreate socket,connect to hostid, port xclientSocket Socket()send request usingclientSocketread reply fromclientSocketcloseclientSocket

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaCiclo de vida de un socket TCPCiclo de vidadel servidor TCPCiclo de vida delcliente TCP

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo Rezaimport java.io.*;import java.net.*;public class SimpleEchoServer{public static void main(String[] args) {try{ServerSocket s newServerSocket(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 2016-1 M.I.YasmineMacedo Rezaimport 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 d(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 2016-1 M.I.YasmineMacedo RezaClase InetAddressLa forma de crear un objeto InetAddress esmediante el método estático:InetAddress.getByName(String host)Recibe un nombre de host en notación alfanumérica (porejemplo "www.etsit.upv.es" o "209.41.57.70" ) devuelveun objeto InetAddress con esa dirección.Si la dirección no existe o no puede ser encontrada, estemétodo lanza una excepción UnknownHostException.

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaSOCKETS UDP

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaNo orientado a conexión Envío de datagramas de tamaño fijo. No es fiable, puede haberpérdidas de información y duplicados, y la información puedellegar 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 claseDatagramSocket. Se encuentran en el paquete java.net

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaClase Datagram SocketConstructores: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 elbind.El constructor DatagramSocket se encarga de hacer elbind.El primer constructor elige un puerto libre.

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaDatagramSocketUn objeto java.net.DatagramSocket es un conector através del cual enviamos y recibimos paquetes UDP.Si se quiere utilizar un DatagramSocket para recibirpaquetes se necesita especificar el puerto.Al contrario, si es para enviar paquetes, no esnecesario especificar este puerto.

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaEjemploDatagramSocket ds1 new DatagramSocket(123);/* Aquí usamos este DatagramSocket para recibirdatos. *//* . *//* 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 2016-1 M.I.YasmineMacedo RezaServicios de la clase DatagramSocketpublic 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 puertolocal (getLocalAddress() y getLocalPort()).

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaDatagramSocketpublic void send ( DatagramPacket p):Envía un datagrama a la máquina remota, por el socketasociado.public void receive ( DatagramPacket p):Recibe un datagrama de otra máquina, por el socketasociado.

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaLa clase DatagramPacketEsta clase representa a los paquetes de datos que vamos arecibir 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 datagramamediante los métodos de la clase java.net.DatagramPacket.cabeceracuerpo

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaDatagramPacketLa forma de construir datagramas es distinta dependiendo de si queremos enviar orecibir datos.En caso de que se quiera recibir, especificar:arreglo de bytes donde almacenar los datoslongitud máxima que queremos recibir.Si queremos transmitir, especificar:arreglo de bytesa enviarlongitud máxima datos a enviardirección y puerto destino del datagrama.

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaClase DatagramPacketConstructorespublic DatagramPacket (byte[] buff, int length)Construye un DatagramPacket para recibir paquetes en elbuffer buff, de longitud lengthpublic 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 @IPaddress y el puerto port.Servicios:Para la actualización y consulta de los diferentes campos de unDatagramPacket disponemos de los siguientes métodos:set/getAddress, set/getData, set/getLength, set/getPort

Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.YasmineMacedo RezaEnviar datosint 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 2016-1 M.I.YasmineMacedo RezaRecibir datosint 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 2016-1 M.I.YasmineMacedo RezaInteracción cliente/servidor: UDPServidor (corriendo en host)create socket,port x, forincoming request:serverSocket DatagramSocket()read request fromserverSocketwrite reply toserverSocketspecifying clienthost address,port numberClientecreate socket,clientSocket DatagramSocket()Create, address (hostid, port x,send datagram requestusing clientSocketread reply fromclientSocketcloseclientSocket

CLIENTE/SERVIDOR Creación de Sockets Cliente Servidor Arquitecturas Cliente/Servidor, Sem 2016-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)