Download Programación Orientada a Objetos con Java Temas Avanzados
Document related concepts
no text concepts found
Transcript
Programa de Formación y Actualización Docente Programación Orientada a Objetos con Java Rafael Rivera López Departamento de Sistemas y Computación Invierno 2005 1 Veracruz, Ver. IV Temas Avanzados 2 IV.2 TCP/IP e Internet 3 URLs Cada pieza de información en la Web tiene una dirección de identificación única llamada URL (Uniform Resource Locator). Ejemplo: http://mx.geocities.com/progiii_rrl/page7.htm Archivo Host/Computadora Protocolo 4 Elementos del URL •Protocolo: Especifica como será accesada la información. •Host: Es la máquina (nodo) origen de la información. •File: Es el archivo que se requiere. 5 Demonio de HTTP •La información de Internet se almacena en servidores Web. •Se accesa a la información disponible con programas llamados demonios (HTTP-daemon). •Un HTTPD es una aplicación que está activa en el servidor y que espera las solicitudes de información. 6 Interacción Navegador-HTTPD usuario solicita http:// java.sun.com /index.html Solicita /index.html host java.sun.com Envía el contenido de index.html Aplicación de HTTPD Navegador Disco 7 Protocolo Un protocolo es un conjunto de reglas que definen el tipo de comunicación: 9 344101 “Si conoce la extensión, capturela” 5 “Conectando a la extensión solicitada” 8 Base de trabajo en red La comunicación en red es complicada, por lo que el trabajo se divide Las funciones de red se dividen en capas. Cada función tiene asociado un protocolo TCP/IP es el conjunto de protocolos para comunicación por internet: Capa Protocolo Aplicación Transporte Red Enlace HTTP, FTP, Telnet, ... TCP, UDP IP Ethernet, TokenRing, ... 9 Capa de Red Todo host conectado a la Internet tiene asociado una dirección IP (135.17.98.240). Adicionalmente, toda computadora tiene una dirección local (127.0.0.1) conocido como el localhost Se puede asociar a cada host un nombre de host (hostname), por ejemplo java.sun.com 135.17.98.250 127.0.0.1 localhost 10 Capa de transporte Todas las capas son importantes, pero la capa de transporte es la que asegura la entrega de la información entre hosts La información que viaja en internet se divide en paquetes de longitud pequeña, que utilizan la red para viajar TCP/IP tiene dos protocolos de transporte: TCP y UDP 11 Capa de transporte TCP (Protocolo de control de transmisión) Verifica que el destino reciba los datos (orientado a conexión) Garantiza un flujo de datos confiable entre dos computadoras. Mantiene el orden de los paquetes enviados. UDP (Protocolo de datagrama de usuario) Envía paquetes de forma independiente. No se garantiza el orden de llegada de los paquetes. No verifica el destino (sin conexión) Más rápido 12 ¿TCP ó UDP? Se utiliza TCP para: HTTP (páginas Web) FTP (Transferencia de archivos remotos) Telnet (Terminal remota) Se utiliza UDP para: Transmisión de Audio Transmisión de video 13 Puertos Cada host en Internet puede ofrecer varios servicios (internet, copia de archivos, correo) a través de los diferentes protocolos existentes. Los involucrados deben saber de antemano que tipo de servicio se utilizará. Un puerto es una abstracción de software que se asocia a cada típo de servicio. Un puerto es un número de 16 bits que identifica a cada servicio ofrecido por un host (un servidor) 14 Puertos Cada destino en Internet es identificado por un host (dirección IP de 32 bits) y un puerto (16 bits). Protocolo Puerto HTTP (Transferencia de Hipertexto) Correo Telnet (conexión remota) FTP (Transferencia de archivos) 80 25 23 21 ¿por qué no se especifica un puerto al usar un navegador? 15 IV.2 Trabajando con redes 16 El paquete java.net El paquete java.net proporciona clases base para trabajar con redes Contiene clases que admiten la comunicación cliente/servidor basada en sockets Proporciona clases para manejar direcciones IP y URL 17 Paquete java.net Object ServerSocket DatagramPacket Socket DatagramSocket Para cliente/servidor sin conexión Para cliente/servidor orientado a conexión InetAddress Para información de una dirección IP URL Para localizar recursos en Internet 18 IV.2 Direcciones IP 19 Clase InetAddress La clase InetAddress representa las direcciones del protocolo IP Método Descripción getHostName() Devuelve el nombre del objeto getHostAddress() Devuelve la IP del objeto getByName(String) Devuelve un objeto InetAddress de un host getLocalHost() Devuelve un objeto InetAddress de la máquina local 20 Devuelve un objeto Ejemplo asociado al nombre del host import java.net.*; public class DireccionIP { public static void main(String[] args) { try { InetAddress host=InetAddress.getByName("www.itver.edu.mx"); System.out.println("Host="+host); System.out.println("IP="+host.getHostAddress()); System.out.println("Nombre="+host.getHostName()); System.out.println( "Localhost="+InetAdress.getLocalHost()); El nombre del catch(UnknownHostException ex){ host System.err.println("Host desconocido"); La IP del host System.exit(0); Devuelve un objeto asociado al localhost 21 Ejemplo import java.net.*; public class DireccionIP { public static void main(String[] args) { try { InetAddress host=InetAddress.getByName("www.itver.edu.mx"); System.out.println("Host="+host); System.out.println("IP="+host.getHostAddress()); System.out.println("Nombre="+host.getHostName()); System.out.println( "Localhost="+InetAdress.getLocalHost()); catch(UnknownHostException ex){ SALIDA:desconocido"); System.err.println("Host Host : www.itver.edu.mx/148.208.233.80 System.exit(0); IP : 148.208.233.80 Nombre : www.itver.edu.mx Localhost: Proy-Inv/10.10.200.103 22 IV.2 Recursos de la Web 23 Clase URL La clase URL representa una Uniform Resource Locator, un apuntador a un recurso en la Web. Un recurso puede ser algo tan simple como un archivo o un directorio, o puede ser una referencia a un objeto más complejo (una consulta a una base de datos, un motor de búsqueda) 24 Lectura desde un URL Abrir flujo de bytes ()URL.openStream Filtro BufferedReader InputStreamReader Maneja bytes como caracteres ()readLine Contenido de una página 25 Ejemplo import java.io.*; import java.net.*; Asocia un objeto a public class ManejoURL { un recurso Web public static void main(String[] args){ try { URL url = new URL("http://mx.geocities.com/progiii_rrl/index.html"); InputStreamReader flujo = new InputStreamReader(url.openStream()); BufferedReader filtro = new BufferedReader(flujo); String linea; while ((linea=filtro.readLine())!=null) { System.out.println(linea); openStream abre un flujo de } bytes. filtro.close(); } InputStreamReader cambia catch (MalformedURLException ex){...} bytes por caracteres. catch (IOException ex) {...} BufferedReader permite leer } Strings } 26 Ejemplo SALIDA: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="Generator" content="Microsoft Publisher 2000"> <title>Programación III</title> </head> <body bgcolor="#ffffff" link="#cc6600" vlink="#808000" text="#000000" background="back.gif" topmargin=0 leftmargin=0> <a name=top></a> <table border=0 27 IV.2 Cliente / Servidor 28 Cliente/servidor Un cliente necesita algún tipo de información Un servidor tiene mucha información que puede proporcionar. Típicamente, un cliente se conecta a un servidor y solicita cierta información. El servidor busca la información y entonces la regresa al cliente. 29 Modelo Cliente/Servidor puerto 80 Aplicación del cliente 200.17.77.12 Aplicación del servidor 64.208.34.100 www.google.com Aplicación del cliente 193.6.124.88 30 Cliente / Servidor • Un cliente - Inicia la conexión - Recupera datos - Despliega datos - Responde a la entradas del usuario - Solicita más datos • Ejemplos: Navegador,Chat •Un servidor: -Responde a la conexión -Recibe la solicitud por datos -Busca los datos -Los libera •Ejemplos: Web Server, Database Server, Domain Name Server, Mail Server … 31 Cliente / Servidor Se puede implementar un esquema cliente servidor con el protocolo TCP: Utilizando las clases ServerSocket y Socket O se puede implementar con el protocolo UDP: Utilizando las clases DatagramPacket y DatagramSocket 32 IV.2 Sockets TCP 33 Sockets Un socket es un punto final de un enlace de dos vías entre dos programas ejecutándose en la red. Los sockets se utilizan para comunicarse a través de puertos. Un socket es un canal de comunicación que permite trasferir datos entre un puerto. Un socket se asocia a un puerto. Cliente: Utilizando la clase Socket. Servidor: Utilizando la clase ServerSocket 34 Usando un socket TCP Un cliente: 2. Abre un socket 3. Abre flujos de entrada y salida para el socket 4. Lee y escribe en los flujos de acuerdo con los protocolos del cliente 5. Cierra los flujos 6. Cierra el socket Un servidor: 2. Abre un socket 3. Abre los flujos de entrada y salida del socket 4. Lee y escribe en los flujos de acuerdo a los procolos del servidor. 5. Cierra los flujos 6. Cierra el socket 35 Clase ServerSocket (servidor) ServerSocket(int port) Crea un socket en el servidor en un puerto específico. Un puerto 0 crea un socket sobre un puerto libre. Método Descripción accept() Acepta una conexión a este socket. close() Cierra el socket getLocalPort() Regresa el puerto en el cual el socket está asociado. getInetAddress() Regresa la dirección IP local del servidor. 36 Clase Socket (cliente) Socket() Socket(InetAddress address, int port); Socket(String host, int port); Crea un socket en el cliente Método Descripción getInputStream() Asocia un flujo de bytes de entrada por el socket getOutputStream() Asocia un flujo de bytes de salida por el socket 37 Ejemplo para Servidor import java.net.*; import java.io.*; public class ServidorTCP { public static void main(String[] args) { int port = 0; String cadena = "Mensaje del servidor"; ServerSocket server = null; try { server = new ServerSocket(port); ... } catch (IOException ioe){...} Socket Servidor Puerto Crea el socket en un puerto libre y espera un cliente Un servidor puede atender varios clientes en un puerto, abriendo varios sockets 38 Ejemplo para Servidor Acepta conexión try { Socket conexion = server.accept(); InputStream flujoBE = conexion.getInputStream(); Reader flujoCE = new InputStreamReader(flujoBE); BufferedReader reader = new BufferedReader(flujoCE); ... Abre flujos BufferedReader Filtro para leer Strings conexion.getInputStream() Flujo de bytes del cliente Servidor Cliente InputStreamReader Maneja un flujo de bytes como flujo de caracteres 39 Ejemplo para Servidor ... OutputStream flujoBS = conexion.getOutputStream(); Writer flujoCS = new OutputStreamWriter(flujoBS); BufferedWriter writer = new BufferedWriter(flujoCS); ... BufferedWriter Filtro para pasar Strings como caracteres Abre flujos conexion.getOutputStream() Flujo de bytes del cliente Servidor Cliente InputStreamWriter Maneja un flujo de caracteres como flujo de bytes 40 Ejemplo para Servidor ... System.out.println("El cliente es "+reader.readLine()); writer.write("Conectado a"+conexion.getInetAddress()); writer.flush(); for(int i=0;i<cadena.length();i++){ writer.write(cadena.substring(0,cadena.length()-i)); writer.flush(); } reader.close(); Lee del writer.close(); cliente conexion.close(); Envía datos al cliente readln() Servidor Cliente write() 41 Ejemplo para Servidor Al correr el programa se presenta la siguiente información: El puerto utilizado por el socket es: 3032 Los clientes deberán conectarse a este servidor usando este puerto La dirección IP del servidor es: Proy-Inv/10.10.200.103 Esperando un cliente Esta es la dirección IP del servidor, necesaria para que el cliente se conecte Es el número de puerto disponible, puede cambiar en cada corrida 42 Lado del cliente El cliente, para conectarse a un servidor con TCP, debe hacerlo indicando a que Servidor y en que puerto se va a conectar. El método Socket(Servidor, puerto) permite crear una conexión TCP del cliente hacia el servidor readln() Servidor Cliente write() 43 Ejemplo para Cliente public static void main(String[] args) { int port = Integer.parseInt(args[1]); Socket cliente = null; try{ cliente = new Socket(args[0], port); } catch (IOException ioe) {...} Se crea una conexión con el servidor dado en args[0] en el puerto indicado por args[1] Los parámetros del cliente indican el nombre del servidor y el puerto al cual conectarse Se debe ejecutar el programa desde la línea de comandos: C:\>java ClienteTCP servidor puerto 44 Ejemplo para Cliente InputStream flujoBE = cliente.getInputStream(); Reader flujoCE = new InputStreamReader(flujoBE); BufferedReader reader = new BufferedReader(flujoCE); OutputStream flujoBS = cliente.getOutputStream(); Writer flujoCS = new OutputStreamWriter(cliente.getOutputStream()); BufferedWriter writer = new BufferedWriter(flujoCS); writer.write(InetAddress.getLocalHost()+"\n"); writer.flush(); String entrada; do{ entrada = reader.readLine(); System.out.println("Recibido: "+entrada); } while(entrada.length()>1); De igual forma que el servidor, abre un flujo de escritura y uno de lectura. 45 Ejemplo para Cliente readln() write() Servidor Cliente write() readln() Como es un esquema orientado a conexión, el enlace permanece hasta que se cierra por alguno de los participantes 46 IV.2 Sockets UDP 47 Clase DatagramSocket Los sockets TCP necesitan que se indique establezca una conexión. Para hacer una trasmisión sin conexiones (UDP) se utiliza la clase DatagramSocket. No se asocia un flujo al puerto. Cada paquete debe indicar información del host origen y del host destino 48 Usando un DatagramSocket 5001 Servidor Cliente 5000 Se requieren dos puertos para una comunicación UDP, uno de envio y otro de recepción (El socket de recepción es 5000 y 5001, para este ejemplo). Constructor Descripción DatagramSocket() Para socket de envío DatagramSocket(puerto) Para socket de recepción 49 Usando un DatagramSocket send() 5001 Servidor Cliente 5000 receive() send() Para enviar y recibir paquetes se utilizan los siguientes métodos. Un paquete es un objeto de la clase DatagramPacket Método Descripción send(DatagramPacket) Para envío receive(DatagramPacket) Para recepción 50 Usando DatagramPacket Para construir el paquete a enviar se crea un objeto con este constructor: DatagramPacket(byte[] buf, int length, InetAddress address, int port) Información enviada en un arreglo de bytes Longitud del arreglo de bytes Dirección IP del destino Puerto al que se envía Para construir el paquete que recibe se crea un objeto con este constructor: DatagramPacket(byte[] buf, int length) 51 Servidor UDP class ServerUDP extends Frame{ ... public ServerUDP(){ ... try{ socketEnvia = new DatagramSocket(); socketRecibe = new DatagramSocket(5000); } catch (SocketException se){... } ... } Crea los sockets de envío y recepción 52 Servidor UDP El objeto captura es un TextField donde se captura la información a enviar ... captura.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ try { byte array[] = new byte[100]; pantalla.append("Servidor: "+captura.getText()+"\n"); array = captura.getText().getBytes(); paqEnviado = new DatagramPacket(array,array.length,host,5001); socketEnvia.send(paqEnviado); captura.setText(""); Se construye el }catch (Exception ex) {... } paqueta a enviar } }); } Se envía el paquete 53 Servidor UDP El método checa paquetes está escuchando al puerto de entrada si se reciben paquetes public void ChecaPaquetes() { while (true){ try { byte array[] = new byte[100]; paqRecibido = new DatagramPacket(array,array.length); socketRecibe.receive(paqRecibido); String recibido = new String(paqRecibido.getData()); host = paqRecibido.getAddress(); pantalla.append(host.getCanonicalHostName()+": "+recibido); pantalla.append("\n"); } catch (Exception ex){...} } } El servidor identifica al cliente que inicio la conversación y a ese cliente es al que le contesta 54 Cliente UDP El servidor y el cliente UDP tienen el casi el mismo código, solo que el cliente debe indicar a que servidor se conecta public ClienteUDP(String servidor){ try { socketEnvia = new DatagramSocket(); socketRecibe = new DatagramSocket(5001); host = InetAddress.getByName(servidor); } ... } captura.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ try{ paqEnviado = new DatagramPacket(array,array.length,host,5000); socketEnvia.send(paqEnviado); ... 55