Introducción ● ● El día de hoy se usan computadoras para: – Hacer llamadas telefónicas. – Ver televisión. – Enviar mensajes de texto, etc. Cada día se crean aplicaciones que demandan más ancho de banda y acceso a internet, el impacto de internet continuará creciendo en el futuro visible. 37 ¿Cómo un programa se comunica con otro a través de la red? ● ● ● ● Canal de comunicacion Computadoras (hosts) interconectadas Routers Programas de aplicación (servidores y clientes, puertos) 38 ¿Cómo un programa se comunica con otro a través de la red? ● ● ● ● La información se transmite en la red son secuencias de bits que se denominan paquetes Un paquete contiene información de control que la red usa para hacer su trabajo y algunas veces incluye información del usuario. Un protocolo es un acuerdo sobre el intercambio de paquetes y el significado de cada parte (estructura) Para resolver distintos problemas se han diseñado de forma modular distintos protocolos (suite TCP/IP, continene los protocolos TCP, IP, UDP) 39 ¿Cómo un programa se comunica con otro a través de la red? Morgan, Kaufman TCP/IP Sockets in java, Segunda edición, 2008 40 Acerca de las direcciones ● ● ● ● ● ● En TCP/IP, se requiere de dos piezas de información para identificar un programa particular: una dirección de internet (IP) y un número de puerto (dirección interpretada por el protocolo TCP o UDP) IP vienen en dos versiones IPv4 (32 bits) e IPv6 (128 bits). Los puertos son direcciones de 16 bits sin signo, de 1 a 65,535 (0 es reservado) La dirección de loopback es asignada a una interfaz especial virtual que simplemente hace eco de los paquetes transmitidos de regreso al emisor. Dirección loopback IPv4 es 127.0.0.1 y para IPv6 es 0:0:0:0:0:0:0:1 Domain Name Service 41 Comunicaciones TCP/IP Introducción ● ● Un sistema de comunicaciones se compone de una pila de niveles encargados de distintas tareas. A este modelo teórico se le llama el Modelo de Referencia OSI. 42 Comunicaciones TCP/IP Introducción ● ● En una red TCP/IP (por ejemplo Internet) algunos niveles se fusionan quedando la siguiente pila: Cuando programamos en Java, solo nos preocupamos del nivel de Aplicación. Java y el Sistema Operativo ya se encargan del resto. 43 Comunicaciones TCP/IP Introducción ● ● ● ● Las máquinas tienen habitualmente una conexión a la red por la que le van a llegar todos los datos. Pero en una misma máquina puede haber n aplicaciones esperando datos. ¿Cómo se sabe para que aplicación son los datos? Gracias a los puertos. Para enviar algo por una red TCP/IP se direcciona mediante una dirección y un puerto: – Dirección: especifica la máquina destino. – Puerto: especifica la aplicación destino. 44 Comunicaciones TCP/IP Introducción ● Gráficamente 45 Comunicaciones TCP/IP Introducción ● ● Algunas direcciones especiales: – 127.0.0.1: Conocida con el nombre de LoopBack. Apunta a la propia máquina. – 192.168.x.x (hay más): Utilizadas para las redes locales privadas conectadas a Internet (por ejemplo vía ADSL). Algunos puertos conocidos: – 21: Servidores FTP. – 23: Servidores Telnet. – 25: Servidores SMTP. – 80: Servidores Web. 46 Clientes y Servidores Introducción ● ● Se refiere a Roles – Cliente, el programa que inicia la comunicación. – Servidor, el programa que espera pasivamente para una petición y entonces responde al cliente que lo constactó. Juntos, el cliente y el servidor forman una aplicación: – 21: Servidores FTP. – 23: Servidores Telnet. – 25: Servidores SMTP. – 80: Servidores Web. 47 Comunicaciones TCP/IP Introducción ● ● Siglas: – HTTP: HiperText Transport Protocol. – FTP: File Transport Protocol. – TCP: Transmission Control Protocol. – UDP: User Datagram Protocol. – IP: Internet Protocol. – URL: Uniform Resource Locator. Todas las clases referentes a comunicación en redes TCP/IP encuentran en java.net.* la se 48 URL ● ● ● Una URL es el identificador unívoco de un recurso en Internet. Una URL consta de las siguientes partes: – Protocolo. – Dirección de la máquina (host). – Puerto. – Path. Por ejemplo: http://download.eclipse.org:80/downloads/in dex.php 49 Creando una URL ● ● En Java, la URL está implementada por la clase java.net.URL Lo mas sencillo es utilizar el constructor donde se le pasa la URL como un String: URL aURL = new URL(“http://www.ibm.com/index.html”); ● ● Esta es una URL absoluta. Pero también podemos crear URLs relativas mediante otro constructor: URL base = new URL(“http://www.ibm.com/”); URL final = new URL(base,“index.html”); 50 Creando una URL ● ● Existen mas constructores donde se puede especificar por separado el puerto, el path, etc.... Todos los constructores de la clase java.net.URL tienen la siguiente cláusula throws: public URL(String MalformedURLException; ● spec) throws Por tanto, siempre tendremos que construir las URLs en un bloque try & catch donde recojamos la excepción java.net.MalformedURLException 51 Atributos de una URL ● Podemos acceder a los atributos de una URL mediante los siguientes métodos: – getProtocol(): Devuelve el protocolo de la URL. – getHost(): Devuelve el host (dirección) de la URL. – getPort(): Devuelve el puerto de la URL. – getFile(): Devuelve el path del recurso. – getRef(): Devuelve la referencia dentro del recurso. 52 Ejemplo 53 Leyendo de una URL ● ● ● La clase java.net.URL tiene un método para poder acceder a su stream de entrada. Este stream es una instancia de la clase java.io.InputStream El método es: public final java.io.InputStream openStream() throws java.io.IOExcpetion; ● A partir del stream ya podremos leer directamente o usar cualquier tipo de filtro sobre este stream. 54 Ejemplo 55 Conectando con una URL ● Una vez que hemos creado una URL, podemos establecer una conexión con ella a través del método: public java.net.URLConnection openConnection() throws java.io.IOExcpetion; ● ● ● Mediante una conexión podremos establecer un diálogo con la URL: escribir y leer. Nota: Una URL no tiene porque ser solo un recurso estático como una página HTML o una imagen. También puede ser un programa CGI, un script PHP, un Servlet Java, una Java Server Page (JSP), etc...... Lo lograremos mediante los métodos getOutputStream y getInputStream. 56 Socket ● ● ● Habitualmente, tenemos una aplicación servidora esperando conexiones de un cliente en un puerto. Y tenemos una aplicación cliente que quiere conectar con ese servidor en ese puerto. Un socket es el link entre una aplicación servidora y un puerto. 57 Socket ● ● ● ● Cuando un cliente conecta con el servidor se crea un nuevo socket a un nuevo puerto. De esta forma, el servidor puede seguir esperando conexiones en el socket principal y comunicarse con el cliente conectado. De igual forma se establece un socket en el cliente en un puerto local. Por tanto, la comunicación se establece entre dos sockets. 58 Socket vs URL ● ● ● Las URLs son un caso específico del trabajo con sockets. Las clases Java relacionadas con las URLs utilizan por debajo sockets. Para el desarrollador es más fácil usar las clases URL, URLConnection, etc.... que los sockets directamente. Pero hay muchos casos donde se requieren clases de comunicación de bajo nivel. Por ejemplo, la implementación de un servidor, el uso de un protocolo propietario, etc.... 59 Socket ● Las clases Java que implementan los sockets son: java.net.Socket java.net.SocketServer ● ● java.net.Socket sirve para establecer un socket en un cliente. Establecer la conexión con un socket servidor. java.net.SocketServer sirve para establecer un socket en un servidor. Poder escuchar posibles conexiones desde sockets cliente. 60 Java.net.Socket ● Trabajar con un socket cliente comprende los siguientes pasos: – Abrir el socket: mediante uno de sus constructores, habitualmente dándole la dirección y el puerto destino. – Abrir el stream de entrada y/o de salida: mediante los métodos getInputStream() y getOutputStream(). – Leer y/o escribir al socket: mediante los métodos de los streams o los filtros que hayamos creado. – Cerrar los streams: mediante el método close(). – Cerrar el socket: mediante el método close(). 61 Atributos de un socket ● Podemos acceder a los atributos de un socket mediante los siguientes métodos: – getInetAddress(): Devuelve dirección destino (remota). la – getPort(): Devuelve el puerto destino (remoto). – getLocalAddress(): Devuelve dirección origen (local). – getLocalPort(): Devuelve el puerto origen (local). la 62 Ejemplo 63 Java.net.ServerSocket Trabajar con un socket servidor comprende los siguientes pasos: ● – Abrir el socket: mediante uno de sus constructores, habitualmente dándole el puerto donde escuchar. – Esperar una petición cliente: mediante el método accept() que devuelve el nuevo socket. – Abrir el stream de entrada y/o de salida: mediante los métodos getInputStream() y getOutputStream(). – Leer y/o escribir al socket: mediante los métodos de los streams o los filtros que hayamos creado. – Cerrar los streams: mediante el método close(). – Cerrar el socket: mediante el método close(). 64 Ejemplo 65 Ejemplo 66 Aceptar múltiples clientes ● Para desarrollar un servidor que pueda gestionar mas de un cliente a la vez debemos: – Introducir la ejecución del método accept() en un bucle. – Este bucle podrá ser infinito o controlado, dependiendo de como queramos terminar el servidor. – Abrir un thread por cada conexión recibida, pasándole como parámetro el nuevo socket generado. 67 Ejemplo 68 Ejemplo 69 Ejemplo 70 Más acerca de las direcciones InetAddress ● boolean isAnyLocalAddress() ● boolean isLinkLocalAddress() ● boolean isLoopbackAddress() ● boolean isMulticastAddress() ● boolean isMCGlobal() ● boolean isMCLinkLocal() ● boolean isMCNodeLocal() ● boolean isMCOrgLocal() ● boolean isMCSiteLocal() ● boolean isReacheable(int timeout) ● boolean isReacheable(NetworkInterface netif, int ttl, int timeout) 71 ¿Cómo un programa se comunica con otro a través de la red? ● ● ● ● Canal de comunicacion Computadoras (hosts) interconectadas Routers Programas de aplicación (servidores y clientes, puertos) 72 ¿Cómo un programa se comunica con otro a través de la red? ● ● ● ● La información se transmite en la red son secuencias de bits que se denominan paquetes Un paquete contiene información de control que la red usa para hacer su trabajo y algunas veces incluye información del usuario. Un protocolo es un acuerdo sobre el intercambio de paquetes y el significado de cada parte (estructura) Para resolver distintos problemas se han diseñado de forma modular distintos protocolos (suite TCP/IP, continene los protocolos TCP, IP, UDP) 73 ¿Cómo un programa se comunica con otro a través de la red? Morgan, Kaufman TCP/IP Sockets in java, Segunda edición, 2008 74 Acerca de las direcciones ● ● ● ● ● ● En TCP/IP, se requiere de dos piezas de información para identificar un programa particular: una dirección de internet (IP) y un número de puerto (dirección interpretada por el protocolo TCP o UDP) IP vienen en dos versiones IPv4 (32 bits) e IPv6 (128 bits). Los puertos son direcciones de 16 bits sin signo, de 1 a 65,535 (0 es reservado) La dirección de loopback es asignada a una interfaz especial virtual que simplemente hace eco de los paquetes transmitidos de regreso al emisor. Dirección loopback IPv4 es 127.0.0.1 y para IPv6 es 0:0:0:0:0:0:0:1 Domain Name Service 75 Operaciones a nivel de bits ● ● ● ● ● ● En TCP/IP, se requiere de dos piezas de información para identificar un programa particular: una dirección de internet (IP) y un número de puerto (dirección interpretada por el protocolo TCP o UDP) IP vienen en dos versiones IPv4 (32 bits) e IPv6 (128 bits). Los puertos son direcciones de 16 bits sin signo, de 1 a 65,535 (0 es reservado) La dirección de loopback es asignada a una interfaz especial virtual que simplemente hace eco de los paquetes transmitidos de regreso al emisor. Dirección loopback IPv4 es 127.0.0.1 y para IPv6 es 0:0:0:0:0:0:0:1 Domain Name Service 76 Operaciones a nivel de bits (MASCARAS) ● ● ● ● ● ● En TCP/IP, se requiere de dos piezas de información para identificar un programa particular: una dirección de internet (IP) y un número de puerto (dirección interpretada por el protocolo TCP o UDP) IP vienen en dos versiones IPv4 (32 bits) e IPv6 (128 bits). Los puertos son direcciones de 16 bits sin signo, de 1 a 65,535 (0 es reservado) La dirección de loopback es asignada a una interfaz especial virtual que simplemente hace eco de los paquetes transmitidos de regreso al emisor. Dirección loopback IPv4 es 127.0.0.1 y para IPv6 es 0:0:0:0:0:0:0:1 Domain Name Service 77 Composición de I/O Streams 78 Composición de I/O Streams 79 Framing and Parsing Framing se refiere a el problema de habilitar al receptor para localizar el inicio y el fin de un mensaje. Ya sea que la información sea codificada como texto, como numeros binarios representados en formato multibyte, o alguna combinación de los dos, el protocolo de la aplicación debe especificar como el receptor de un mensaje pueda determinar cuando ha recibido todos los mensajes. 80 Framing and Parsing Si un mensaje completo es enviado como el payload de un DatagramPacket, el problema es trivial: el payload del DatagramPacket tiene una longitud finita. Para mensajes enviados sobre sockets TCP, puede ser más complicada porque el mensaje TCP no tiene noción de fronteras. 81 Framing and Parsing Si los campos en un mensaje tienen tamaños fijos y los mensajes estan compuestos de un número fijo de campos, entonces el tamaño del mensaje es conocido y el receptor puede simplemente leer el número esperado de bytes en un buffer de tipo byte[]. Sin embargo, cuando el mensaje varia en longitud – por ejemplo, contiene algunos campos de longitud arbitraria (cadenas de texto) no sabriamos con antelación cuántos bytes leer. 82 Framing and Parsing Si un receptor trata de recibir mas bytes del socket que de los que estan en el mensjaem una de dos cosas pueden pasar. ● ● Si no hay otro mensaje en el canal, el receptor se bloqueará evitando que el mensaje se procese. Si el emisor se bloquea esperando una replica o respuesta al mensaje enviado, entonces se crea un candado mortal. Por otro lado, si un mensaje está en el canal, el receptor podría leer alguna parte o todo el mensaje siguiente como parte del mensaje anterior, llevando a errores del protocolo. Por lo que framing es una importante consideración cuando se usan sockets TCP. 83 Framing and Parsing Las mismas consideraciónes se aplican para encontrar las fronteras de los campos individuales del mensaje. ● ● El receptor necesita saber donde termina uno y donde empieza otro. Para mejor limpieza y simplicidad del código, se deben abordar los dos problemas de forma separada: primero localizar el fin de un mensaje, y después analizar el mensaje como un todo. 84 Framing and Parsing Técnicas generales para encontrar el fin de un mensaje: ● ● Basado en delimitador: el fin del mensaje es indicado por un marcador único, una secuencia explícita de bytes que el emisor transmite inmediatamente después de los datos. El delimitador no debe nunca aparecer como parte de los datos. Longitud explícita: Los mensajes o cmapos variables deben ser precedidos por un campo de longitud fija que diga cuantos bytes contiene. 85 Framing and Parsing El esquema basado en delimitador, es usado con mensajes codificados como texto: ● ● ● ● Una secuencia específica de caracteres o caracter es definida para marcar el fin de un mensaje. El receptor simplemente explora los datos (como caracter) buscando la secuencia que delimita el mensaje y regresa la secuencia de caracteres que precede al delimitador. El emisor debe asegurarse de que dentro del mensaje no vaya el caracter de delimitación. La desventaja es que tanto el emisor como el receptor deben explorar el mensaje. 86 Framing and Parsing El enfoque basado en longitud es mas simple, pero requiere conocer la frontera superior del tamaño del mensaje. ● ● ● ● El emisor primero determina la longitud del mensaje, lo codifica como un entero y envia como prefijo el mensaje resultante. La parte superior de la longitud del mensaje determina el numero de bytes requeridos para codificar el mensaje: un byte si el mensaje siempre contiene menos de 253 bytes, dos bytes si el mensaje es siempre menor que 65,536 bytes, y así sucesivamente. El emisor debe asegurarse de que dentro del mensaje no vaya el caracter de delimitación. La desventaja es que tanto el emisor como el receptor deben explorar el mensaje. 87 Referencias Copyright (c) José M. Ordax 88