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 Solicita /index.html usuario solicita http:// java.sun.com /index.html host java.sun.com Envía el contenido de index.html Aplicación de HTTPD Disco Navegador 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 Aplicación Transporte Red Enlace Protocolo HTTP, FTP, Telnet,... TCP, UDP IP Ethernet, Token- Ring,... 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
Se utiliza TCP para: Se utiliza UDP para: Transmisión de Audio Transmisión de video TCP ó UDP? HTTP (páginas Web) FTP (Transferencia de archivos remotos) Telnet (Terminal remota) 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 HTTP (Transferencia de Hipertexto) Correo Telnet (conexión remota) FTP (Transferencia de archivos) Puerto 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 Socket Para cliente/servidor orientado a conexión DatagramPacket DatagramSocket Para cliente/servidor sin conexión Para información de una dirección IP InetAddress 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 gethostname() gethostaddress() getbyname(string) getlocalhost() Descripción Devuelve el nombre del objeto Devuelve la IP del objeto Devuelve un objeto InetAddress de un host Devuelve un objeto InetAddress de la máquina local 20
Ejemplo Devuelve un objeto asociado al nombre del t java.net.*; host c class DireccionIP { ic static void main(string[] args) { { etaddress host=inetaddress.getbyname("www.itver.edu.mx"); stem.out.println("host="+host); stem.out.println("ip="+host.gethostaddress()); stem.out.println("nombre="+host.gethostname()); stem.out.println( "Localhost="+InetAdress.getLocalHost()); ch(unknownhostexception ex){ stem.err.println("host desconocido"); stem.exit(0); Devuelve un objeto asociado al localhost El nombre del host La IP del host 21 Ejemplo t java.net.*; c class DireccionIP { ic static void main(string[] args) { { etaddress host=inetaddress.getbyname("www.itver.edu.mx"); stem.out.println("host="+host); stem.out.println("ip="+host.gethostaddress()); stem.out.println("nombre="+host.gethostname()); stem.out.println( "Localhost="+InetAdress.getLocalHost()); ch(unknownhostexception ex){ stem.err.println("host SALIDA: desconocido"); stem.exit(0); Host : www.itver.edu.mx/148.208.233.80 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 InputStreamReader Maneja bytes como caracteres BufferedReader ()readline Contenido de una página 25 Ejemplo import java.io.*; import java.net.*; public class ManejoURL { 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); } filtro.close(); } catch (MalformedURLException ex){...} catch (IOException ex) {...} } } Asocia un objeto a un recurso Web openstream abre un flujo de bytes. InputStreamReader cambia bytes por caracteres. 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
Un cliente - Inicia la conexión - Recupera datos - Despliega datos - Responde a la entradas del usuario - Solicita más datos Ejemplos: Navegador,Chat Cliente / Servidor 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
Un cliente: 2. Abre un socket Usando un socket TCP 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 accept() close() getlocalport() getinetaddress() Descripción Acepta una conexión a este socket. Cierra el socket Regresa el puerto en el cual el socket está asociado. 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 getinputstream() getoutputstream() Descripción Asocia un flujo de bytes de entrada por el socket 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){...} Crea el socket en un puerto libre y espera un cliente Servidor Puerto Socket Un servidor puede atender varios clientes en un puerto, abriendo varios sockets 38
Ejemplo para Servidor try { Socket conexion = server.accept(); InputStream flujobe = conexion.getinputstream(); Reader flujoce = new InputStreamReader(flujoBE); BufferedReader reader = new BufferedReader(flujoCE);... BufferedReader Filtro para leer Strings Acepta conexión Abre flujos conexion.getinputstream() Flujo de bytes del cliente Servidor InputStreamReader Maneja un flujo de bytes como flujo de caracteres Cliente 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(); writer.close(); conexion.close(); readln() Envía datos al cliente Lee del cliente Servidor write() Cliente 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 Es el número de Esta es la dirección IP del servidor, necesaria para que el cliente se conecte 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 write() Cliente 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 write() readln() Cliente 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 5000 Cliente 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 DatagramSocket() DatagramSocket(puerto) Descripción Para socket de envío Para socket de recepción 49 Usando un DatagramSocket send() Servidor 5000 5001 Cliente receive() send() Para enviar y recibir paquetes se utilizan los siguientes métodos. Un paquete es un objeto de la clase DatagramPacket Método send(datagrampacket) receive(datagrampacket) Descripción Para envío 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(""); }catch (Exception ex) {... } } }); Se envía el paquete Se construye el paqueta a enviar 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