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 • Definición de DAEMON • Concepto de Hilos • Sockets en UDP 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 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