Download Sin título de diapositiva - DSIC
Document related concepts
no text concepts found
Transcript
TEMA 3. Programación en red 1. 2. 3. 4. 5. 6. Introducción Dirección IP. Clase InetAddress Conexión mediante URL. Conexión mediante TCP/IP Conexión mediante UDP/IP Acceso a Bases de Datos 1 Bibliografía Bobadilla, J. y otros. Comunicaciones y Bases de Datos en Java. Capítulo 2. M.L.Liu. Computación Distribuida. Ed. Pearson. Capítulos 1,2,3 y 4. 2 1 . Introducción Diferentes formas de Computación Computación monolítica. Un único ordenador, Computación distribuida. Implica el uso de múltiples Computación paralela. Implica el uso de varios Computación cooperativa. En este tipo de proyectos pueden acceder al sistema múltiples usuarios. ordenadores conectados a la red. procesadores simultáneos. se divide la computación a gran escala entre las máquinas de internet. Ej. Búsqueda de inteligencia extraterrestre. 3 1 . Introducción Internet Internet es una red de redes, miles de redes basadas en tecnologías heterogéneas se enlazan en la Internet ofreciendo un conjunto homogéneo de servicios. En Internet se encuentran ordenadores muy diversos con sistemas operativos diferentes. Los protocolos de la familia TCP/IP son los que hacen posible que todos estos sistemas compartan información entre sí. 4 1 . Introducción Internet La familia de protocolos TCP/IP abarca los siete niveles OSI (Open System Interconnect). 5 1 . Introducción Internet Cobertura internacional Protocolo a nivel de transporte es el TCP, UDP y RTSP (real time streaming protocol). Gran difusión Importancia social Facilidad de acceso (telefónica) … 6 1 . Introducción Redes locales Las redes locales permiten compartir recursos como impresoras, modem o disco de almacenamiento entre los ordenadores conectados a al red (Ethernet, token Ring, SNA, DECNET). La tecnología de red local es el primer eslabón en la cadena de Internet 7 1 . Introducción Protocolo Internet (IP) El protocolo IP es el elemento que permite integrar distintas redes entre si (distintas redes: FDDI, RDSI, X.25, lineas dedicadas, token ring, ethernet, lineas telefónicas,...) Cada máquina de Internet tiene una dirección IP única. Una dirección IP es un número de 32 bits que normalmente se escribe como cuatro enteros entre 0 y 255 separados por puntos (192.112.36.5). La dirección IP permite el encaminamiento de la información a través de la Internet. 8 1 . Introducción Estrategia de Internet En la terminología de comunicaciones el protocolo IP define una red de conmutación de paquetes. La información se fragmenta en pequeños trozos o paquetes (alrededor de 1500 caracteres) que se envían independientemente por la red. Cada paquete es enviado con la dirección del ordenador donde ha de ser entregado y, de forma similar a como funciona un sistema postal, cada paquete viaja independientemente de los demás por la red hasta alcanzar su destino. 9 1 . Introducción Estrategia de Internet Dentro de una red local, el encaminamiento de la información es simple. En Ethernet por ejemplo todos los ordenadores 'escuchan' la red para detectar los paquetes que se le dirigen a ellos. Los routers (antes llamados gateway) son los elementos encargados del encaminamiento de los mensajes IP. Los routers conocen las máquinas conectadas a la red y toman la decisión de como encaminar los paquetes de datos a través de unos enlaces u otros. 10 1 . Introducción Estrategia de Internet Cada router sólo necesita saber que conexiones están disponibles y cual es el mejor "próximo salto" para conseguir que un paquete este mas cerca de su destino (El paquete va "saltando" de router a router hasta llegar a su destino). Las máquinas de Internet, fuera del entorno de la red local, utilizan un router para encaminar los paquetes. 11 1 . Introducción Esquema 12 1 . Introducción Protocolo de transporte Protocolo a nivel de transporte es el TCP y UDP. TCP, supone comunicación orientada a conexión. Ejemplo la llamada telefónica UDP, supone comunicación sin conexión. Ejemplo correo postal. 13 1 . Introducción WWW El servicio de mayor crecimiento en la red es WWW, en el que se distinguen dos tipos de ordenadores: cliente y servidor. Http, es el protocolo de transferencia de hipertexto, permite que navegador (cliente) y servidor puedan hablar entre si mediante un alfabeto. El protocolo es muy sencillo: – Petición: Método solicitado, Cabecera de petición, Datos solicitados – Respuesta: Código de estado, Cabecera de respuesta, Datos de respuesta 14 1 . Introducción Programación en red La programación en red ha sido siempre dificultosa, el programador debía conocer muchos detalles sobre la red y algunas veces sobre el propio hardware. La idea es sencilla, se trata de obtener información desde otra máquina o enviar información hacia otra máquina, en cierta manera es parecido a leer y escribir archivos. En Java es muy fácil realizar programas en red. La mayoría de los detalles han sido escondidos y son tratados de forma transparente por parte de la JVM. 15 1 . Introducción Programación en red Algunas de las capacidades de Java para construir programas que trabajen con la red son : – – – – – – Direcciones de Internet (java.net) Conexión mediante URLs (java.net) Conexión mediante TCP/IP y UDP/IP (java.net) Proporcionar servicios vía WWW (servlets y JSP) Conexión a bases de datos JDBC (java.sql) Acceso a métodos remotos RMI de objetos (java.rmi) 16 2 . Dirección IP Direcciones de Internet La forma que se identifican las máquinas en la red es a través de la dirección IP (Internet Protocol) o bien a través de un nombre de máquina y usando el mecanismo de resolución de nombres (DNS) para obtener la dirección IP. En Java se encuentra la clase InetAddress que representa una dirección de internet. 17 2 . Dirección IP IP Representa las direcciones única de cada máquina en Internet. Se representan a través de un cuatro números de 8 bits, por ejemplo 123.255.28.120. Internamente se representa como un número de 32 bits. Debido a que las direcciones IP son difíciles de recordar, existe un mecanismo de direcciones simbólicas que asignan un nombre a cada máquina. 18 2 . Dirección IP IP Ya que se van a usar ambos tipos de direcciones para designar a una máquina se hace necesario que haya un mecanismo para pasar de uno al otro lado y viceversa. El DNS (Domain Name System) consiste, básicamente, en una base de datos distribuida de forma jerárquica por toda la Internet que es consultada por el usuario para llevar a cabo la traducción entre los nombres y las direcciones numéricas. 19 2 . Dirección IP La clase InetAddress Esta clase no tiene constructores visibles, podemos obtener objetos de esta clase de la siguiente forma: InetAddress dir = InetAddress.getLocalHost(); InetAddress dir = InetAddress.getByName(String g); InetAddress dir = InetAddress. getByAddress(byte[] addr) La creación de un objeto InetAddress puede generar una excepción de tipo UnknownHostException, si no existe dicha 20 dirección Internet 2 . Dirección IP La clase InetAddress import java.net.*; public class Obtener_IP { public static void main(String[] args)throws Exception { if(args.length != 1) { System.err.println("Escribe el nombre de la máquina"); System.exit(1); } InetAddress a = InetAddress.getByName(args[0]); System.out.println(a); } 21 } 3 . Conexión mediante URL URL Un URL es la dirección de un elemento o recurso en la WWW: [protocolo://][dirección][:puerto][/ruta] Donde: – Protocolo es el lenguaje mediante el que se comunican, los más habituales son: ftp - Protocolo de Transferencia de Ficheros http - Protocolo de Transferencia de HiperTexto mailto - Dirección de Correo Electrónico news - Noticias USENET – Dirección es una dirección de internet – Puerto es un puerto, normalmente el servicio web esta en el 80 22 – Ruta es una ruta en la máquina del servidor 3 . Conexión mediante URL La clase URL La clase URL permite la descarga de los datos a los que se refiere un URL de Internet y, además, consigue cierta interacción con ese recurso. La clase URL está orientada al tratamiento del protocolo HTTP de la web. Java permite crear un URL a partir de una cadena y, luego, poder establecer una URLConnection con el URL URL URL URL URL (String); (URL, nombre_fich_relativo); (esquema,anfitrión, nombref); (esquema,anfitrión, p,nombref); En caso de utilizar una sintaxis incorrecta se lanza la excepción 23 MalformedURLException 3 . Conexión mediante URL La clase URL Ejemplo: URL info=new URL(“http://www.dsic.upv.es”); URL frame = new URL(info,”frames.html”); Dado un objeto URL, las partes que lo constituyen pueden recuperarse con: – – – – getProtocol() getHost() getPort() getFile() 24 3 . Conexión mediante URL Lectura desde un URL URL urlobj = new URL(...); InputStream in = urlobj.openStream(); // lectura del canal haciendo // uso de un filtro BufferedReader c=new BufferedReader(new InputStreamReader(in)); String linea=c.readLine(); 25 3 . Conexión mediante URL Ejemplo public class ReadUrl {public static void readOut( String url, OutputStream out){ try{ URL urlobj = new URL(url); InputStream in = urlobj.openStream(); int c While ((c=in.read())>-1) out.write(c); in.close(); }catch(MalformedURLExection e){;} catch(IOExection e){;} 26 }} 3 . Conexión mediante URL Comunicación con un URL En general se debe enviar primero información de consulta antes de recuperar los datos de la URL. Los pasos son los siguientes: – Establecer un objeto URLConnection, a partir de la URL. – Establecer los parámetros de la conexión deseada – Conectarse con el URL destino – Escribir los datos de consulta de la conexión – Leer la respuesta. 27 3 . Conexión mediante URL La clase URLConnection El método openConnection crea y devuelve un objeto URLConnection para lectura y escritura o ambas. URLConnection connection = urlobj.openConnection(); Activar la escritura connection.setdoOutput(true); connection.connect(); Ahora se puede escribir al URL, utilizando OutputStream de la conexión o leer con InputSream. //escritura OutputStream out= connection.getOutputStream(); // lectura InputStream in= connection.getInputStream(); 28 3 . Conexión mediante URL La clase URLConnection En una conexión de url también se puede leer el encabezado del mensaje enviado por el servidor (http). – – – – – getContentEncoding getContentLength getDate getLastModifed -... Al escribir en una conexión URLConnection se envián datos a un servidor mediante una consulta Post. Una consulta Post incluye: – Un URL que especifica un programa cgi. – Encabezados Content-Type y Content-Length – Un cuerpo del mensaje Nos debemos preocupar solo del cuerpo del mensaje.(convención form de html). Clase URLEncoder y URLDecoder (UTF-8). 29 3 . Conexión mediante URL La clase URLConnection Ejemplo. El siguiente código se conecta al recurso import java.io.*; import java.net.*; public class ReverseTest { public static void main(String[] args) { try { if (args.length != 1) { System.err.println("Usage: java ReverseTest string_to_reverse"); System.exit(1); } String stringToReverse = URLEncoder.encode(args[0]); URL url = new URL("http://java.sun.com/cgi-bin/backwards"); URLConnection connection = url.openConnection(); connection.setDoOutput(true); 30 3 . Conexión mediante URL La clase URLConnection PrintWriter writer = new PrintWriter(connection.getOutputStream()); writer.println("string=" + stringToReverse); writer.close(); BufferedReader reader = new BufferedReader( new InputStreamReader(connection.getInputStream())); String inputLine; } } while ((inputLine = reader.readLine()) != null) { System.out.println(inputLine); } reader.close(); } catch (MalformedURLException me) { System.err.println("MalformedURLException: " + me); } catch (IOException ioe) { System.err.println("IOException: " + ioe); } 31 4 . Conexión mediante TCP/IP Protocolo de control de la transmisión (TCP) En su tránsito por distintas redes y equipos encaminadores, puede ocurrir que haya paquetes IP que se pierdan, lleguen duplicados o con errores en la información que contienen. El protocolo TCP se encarga de subsanar estas posibles deficiencias para conseguir un servicio de transporte de información fiable. TCP fragmenta la información a transmitir, de la misma forma que lo hace el protocolo IP. TCP numera cada uno de estos paquetes de manera que el receptor de la información pueda ordenarlos al recibirlos. Para pasar esta información a través de la red, TCP utiliza un sobre identificado con el número de secuencia de cada paquete. Los paquetes TCP se envían a su destino, independientemente unos de otros, utilizando el protocolo IP. 32 4 . Conexión mediante TCP/IP Protocolo de control de la transmisión (TCP) En la parte receptora, el TCP recoge el paquete, extrae los datos, y los pone en el orden correcto. Si algunos sobres desaparecen, el receptor le pide al transmisor que retransmita los paquetes de nuevo. Cuando toda la información recogida esta en su orden, se pasan los datos a la capa de aplicaciones. Esto es una visión ideal del TCP. En la práctica los paquetes no solamente se pueden perder, sino que pueden sufrir cambios en su transito por la red. TCP resuelve este problema colocando en el paquete que se envía lo que se denomina el "checksum". Cuando el paquete llega a su destino, el receptor TCP calcula que checksum debe ser y lo compara con el que se ha enviado. Si no son los mismos el TCP receptor entiende que ha habido un error en la transmisión y le pide al transmisor que reenvíe. De esta forma el TCP ofrece un servicio fiable de transmisión de información. Todas las aplicaciones de la Internet utilizan los servicios de transporte TCP para el intercambio de información, de forma que pueden ignorar los problemas de envío de información a través de la red, o al33 menos muchos de ellos. 4 . Conexión mediante TCP/IP Protocolo de datagramas de usuario (UDP) Establecer una conexión TCP requiere gran cantidad de información en las cabeceras de los paquetes y en consecuencia retrasos en la transmisión. Si se quiere enviar un paquete y no se requiere una particular precaución en el reparto del mismo entonces se pude usar otro protocolo que sea mas simple que el TCP. En este caso se usa el "protocolo de datagramas del usuario (UDP) que se utiliza en vez del TCP en algunas aplicaciones. UDP es mas simple que el TCP porque no se preocupa de mensajes que se pierdan, mantener el orden en los paquetes que se envían, etc... UDP se usa para programas que sólo envían mensajes cortos, y pueden reenviar el mensaje si una respuesta no se produce en período corto de tiempo. El UDP también se utiliza en el entorno de la red local donde la tasa de errores de transmisión es muy pequeña, y no es necesario el sofisticado control de errores del protocolo TCP. 34 4 . Conexión mediante TCP/IP Sockets (conectores) TCP proporciona un canal de comunicación fiable punto a punto, se usa para aplicaciones cliente-servidor. Las clases Socket y ServerSocket del paquete java.net proporcionan un canal de comunicación independiente del sistema utilizando TCP. Un socket es un punto final en un enlace de comunicación de dos vías entre dos programas que se ejecutan en la red. Las clases Socket son utilizadas para representar conexiones entre un programa cliente y otro programa servidor. El paquete java.net proporciona dos clases -- Socket y ServerSocket -- que implementan los lados del cliente y del servidor de una conexión, respectivamente. 35 4 . Conexión mediante TCP/IP Creación de conexiones En primer lugar, se crea un socket en el servidor de manera que los clientes puedan establecer un flujo con él. El servidor se queda esperando al cliente (método accept) El cliente ya puede crear un socket y establecer un flujo con el servidor a través de él utilizando el flujo creado, cliente y servidor pueden utilizar métodos de lectura y escritura para recibir y enviar datos Para crear un socket Java, necesitamos una dirección Internet válida y un número válido de puerto Un servidor es un programa Java que proporciona un socket en el puerto en cuestión 36 4 . Conexión mediante TCP/IP Establecimiento de comunicaciones Programa cliente Programa servidor 2.-accept 1.-instanciación 3.-instanciación ServerSocket Puerto destino Socket 4.-Conexión TCP 5.-return del accept Puerto destino Socket Nodo destino Puerto 6.-Comunicación 37 4 . Conexión mediante TCP/IP Creación de conexiones Creación de socket servidor ServerSocket oyente = new ServerSocket(puerto); Espera del servidor Socket ss = oyente.accept(); Creación de socket cliente Socket sc = new Socket (InetAddress maquina_servidora, int puerto); Flujos para sockets DataInputStream nombreFlujoEntrada = new DataInputStream (sc.getInputStream()); DataOutputStream nombreFlujoSalida = new DataOutputStream (ss.getOutputStream()); Operaciones de lectura/escritura sobre: nombreFlujoEntrada y nombreFlujoSalida 38 4 . Conexión mediante TCP/IP Ejemplo. Cliente hola mundo. import java.net.Socket; import java.io.*; import java.net.UnknownHostException; public class TCPClienteHolaMundo { public static void main(String[] args) { OutputStream FlujoDeSalida; InputStream FlujoDeEntrada; try { Socket SocketCliente = new Socket("localhost", 8000); FlujoDeSalida = SocketCliente.getOutputStream(); OutputStreamWriter CanalS = new OutputStreamWriter(FlujoDeSalida); PrintWriter CanalSalida = new PrintWriter(CanalS,true); 39 4 . Conexión mediante TCP/IP Ejemplo. Cliente hola mundo. System.out.println("enviando texto"); CanalSalida.println("Hola Mundo"); FlujoDeEntrada = SocketCliente.getInputStream(); InputStreamReader CanalE = new InputStreamReader(FlujoDeEntrada); BufferedReader CanalEntrada = new BufferedReader(CanalE); String inputLine; System.out.println("esperando respuesta"); inputLine = CanalEntrada.readLine(); System.out.println(inputLine); 40 4 . Conexión mediante TCP/IP Ejemplo. Cliente hola mundo. CanalSalida.close(); CanalEntrada.close(); SocketCliente.close(); } catch (UnknownHostException e) { System.out.println("Referencia a host no resuelta"); } catch (IOException e) { System.out.println("Error en las comunicaciones"+e); } catch (SecurityException e) { System.out.println("Comunicacion no permitida por razones de seguridad"); }}} 41 4 . Conexión mediante TCP/IP Ejemplo. Servidor hola mundo. public class TCPServidorHolaMundo { public static void main(String[] args) { InputStream FlujoDeEntrada; OutputStream FlujoDeSalida; try { ServerSocket SocketServidor = new ServerSocket(8000); Socket ComunicaConCliente = SocketServidor.accept(); System.out.println("Comunicacion establecida"); FlujoDeEntrada = ComunicaConCliente.getInputStream(); InputStreamReader CanalE = new InputStreamReader(FlujoDeEntrada); BufferedReader CanalEntrada = new BufferedReader(CanalE); String inputLine; inputLine = CanalEntrada.readLine(); System.out.println(inputLine); 42 4 . Conexión mediante TCP/IP Ejemplo. Servidor hola mundo. FlujoDeSalida = ComunicaConCliente.getOutputStream(); OutputStreamWriter CanalS = new OutputStreamWriter(FlujoDeSalida); PrintWriter CanalSalida = new PrintWriter(CanalS,true); System.out.println("Mandando respuesta"); CanalSalida.println("hola mundo de nuevo"); System.out.println("hola mundo de nuevo"); CanalSalida.close(); 43 4 . Conexión mediante TCP/IP Ejemplo. Servidor hola mundo. CanalEntrada.close(); ComunicaConCliente.close(); SocketServidor.close(); } catch (IOException e) { System.out.println("Error en las comunicaciones"+e); System.exit(0); } catch (SecurityException e) { System.out.println("Comunicacion no permitida por razones de seguridad"); System.exit(0); }}} 44 5 . Conexión mediante UDP/IP UDP (User Datagram Protocol) En la transmisión sin conexión con Datagramas, un mensaje se divide o puede dividirse en varios fragmentos que pueden llegar en orden, en desorden, o no llegar. Este protocolo proporciona comunicaciones no fiables, no esta orientado a conexión y por lo tanto Java no asocia los Streams a los datagramas. 45 5 . Conexión mediante UDP/IP UDP (User Datagram Protocol) Puesto que en la cabecera de un paquete se incluye el protocolo utilizado, los programas asociados a cada protocolo se diferencian entre sí, y pueden utilizar el mismo rango de puertos. . En la cabecera de un paquete UDP se incluye un campo de redundancia para que en el destino se compruebe la integridad de los datos. 46 5 . Conexión mediante UDP/IP UDP (User Datagram Protocol) Cuando a un programa le llega un Datagrama, necesita saber la dirección y el puerto del programa origen para saber dónde debe contestar. Cada mensaje UDP puede albergar hasta 508 bytes. Java proporciona dos clases para el uso del protocolo: – DatagramSocket – DatagramPacket 47 5 . Conexión mediante UDP/IP Establecimiento de comunicaciones Programa cliente Programa servidor 2.-new DatagramPacket 4.-new DatagramPacket 5.-new DatagramSocket 1.-new DatagramSocket DatagramSocket 6.-send DatagramSocket 3.-recive Puerto destino Puerto destino Nodo destino 48 5 . Conexión mediante UDP/IP DatagramPacket La clase DatagramPacket se usa para crear los paquetes utilizados para enviar y/o recibir información En su construcción distinguimos entre la recepción y el envío de paquetes. Paquetes para recepción de datos: DatagramPacket (byte buf[], int longitud) Paquetes para envío de datos: DatagramPacket (byte buf[],int longitud, InetAddress dir, int puerto) 49 5 . Conexión mediante UDP/IP DatagramPacket Métodos de acceso al estado interno de un DatagramPacket: InetAddress getAddress() int getPort() byte[] getData() int getLength() 50 5 . Conexión mediante UDP/IP DatagramSocket Sockets para enviar y recibir paquetes DatagramSocket() establece un socket (que le asigna el computador) por el que se enviarán paquetes a la red DatagramSocket(int numPuerto) recibe un argumento entero para establecer un puerto por el que se recibirán paquetes de la red Si no se logra establecer un DatagramSocket se lanzará una SocketException. 51 5 . Conexión mediante UDP/IP DatagramSocket Métodos de la clase DatagramSocket: void receive (DatagramPacket p): se bloquea hasta que llega un paquete y luego almacena el paquete en su argumento p. void send (DatagramPacket p): envía un paquete p por la red (Si ocurre algún error al enviar o recibir paquetes se lanza una IOException) 52