Download Transparencias del Tema 16 - Departamento de Ingeniería Telemática
Document related concepts
no text concepts found
Transcript
Tema 16: Comunicaciones en Red Fundamentos de Telemática Área de Ingeniería Telemática 1 Universidad de Sevilla Índice Introducción. Socket. URL. Datagramas. Fundamentos de Telemática Área de Ingeniería Telemática 2 Universidad de Sevilla Introducción Se puede realizar con cualquier lenguaje java.net Las clases encapsulan el paradigma de “socket” (conectores) creados por BSD (Berkeley Software Distribution) en la Universidad de Berkeley. UNIX 4.2BSD (Bill Joy, en Sun Microsystems). Los programas Java están en la capa de aplicación. Pasos: Abrir, leer/escribir, cerrar. Fundamentos de Telemática Área de Ingeniería Telemática 3 Universidad de Sevilla TCP (Transport Control Protocol) Comunicaciones fiables, establecen una conexión y comunicaciones en ambos sentidos. El orden en que se envían y reciben los datos es crítico. Servicio telefónico. Ejemplos: HTTP (Hypertext Transfer Protocol) FTP (File Transfer Protocol) Telnet Clases: URL, URLConnection, Socket y ServerSocket. Fundamentos de Telemática Área de Ingeniería Telemática Universidad de Sevilla 4 UDP (User Datagram Protocol) No está orientado a conexión. No se garantiza la entrega. Servicio postal. Los paquetes de datos: datagramas. Clases: DatagramPacket, DatagramSocket y MulticastSocket. Fundamentos de Telemática Área de Ingeniería Telemática 5 Universidad de Sevilla Puertos Distingue la aplicación dentro de la máquina. Los datos van acompañados de la dirección de la computadora (32 bits) el puerto al que va destinado (16 bits) Rango para los puertos: 0-65535 Fundamentos de Telemática Área de Ingeniería Telemática 6 Universidad de Sevilla Servidor Puerto Cliente Fundamentos de Telemática Área de Ingeniería Telemática 7 Universidad de Sevilla Aplic. Aplic. Aplic. Aplic. puerto puerto puerto puerto TCP o UDP Datos #puerto Datos Fundamentos de Telemática Área de Ingeniería Telemática 8 Universidad de Sevilla Conectores reservados TCP/IP reserva los primeros 1024 para sus protocolos específicos. Puerto Servicio 13/udp 21/tcp 23 /tcp 25 /tcp 79 /tcp 80 /tcp 119 /tcp daytime ftp telnet E-mail finger HTTP netnews Fundamentos de Telemática Área de Ingeniería Telemática 9 Universidad de Sevilla Servicio de nombres de Dominio (DNS) Existe una jerarquía de nombres asociada a los números que representan las direcciones que se conoce como DNS. Permite teclear www.yahoo.com en vez de 205.216.146.71. Fundamentos de Telemática Área de Ingeniería Telemática 10 Universidad de Sevilla Aplicación (HTTP, ftp, telnet, ...) Transporte (TCP, UDP, ...) Red (IP, ...) Fundamentos de Telemática Enlace (dispositivo driver, ...) Área de Ingeniería Telemática 11 Universidad de Sevilla El paquete java.net (I) SocketImpl Socket ServerSocket SocketPermission Clase abstracta. Implementa un cliente Socket. Implementa un servidor Socket. Acceso a la red vía socket Fundamentos de Telemática Área de Ingeniería Telemática 12 Universidad de Sevilla El paquete java.net (II) URL URLConnection URLClassLoader Puntero a un recurso en la world wide web Clase abstracta. Superclase para comunic. entre aplic y URL. Carga clases y recursos URLDecoder Convierte el formato MIME en String URLEncoder Convierte el formato String en MIME URLStreamHandler Clase abstracta. HttpURLConnection Un URLConnection con soporte para características http. JarURLConnection ContentHandler Uso de archivos JAR Clase abstracta. Fundamentos de Telemática Área de Ingeniería Telemática 13 Universidad de Sevilla El paquete java.net (III) DatagramPacket Clase que representa un datagrama. DatagramSocket Tx/Rx de datagramas en un socket. MulticastSocket Tx/Rx de paquetes IP multicast. Fundamentos de Telemática Área de Ingeniería Telemática 14 Universidad de Sevilla El paquete java.net (y IV) InetAddress Authenticator NetPermission PasswordAuthentication Respresenta una dirección de IP. Autentificación para una conexión a la red. Clase para permisos en la red. Para autentificación Fundamentos de Telemática Área de Ingeniería Telemática 15 Universidad de Sevilla InetAddress Encapsula direcciones IP y sus nombres. No tiene constructores visibles, pero se proporcionan métodos estáticos. static InetAddress getLocalHost() Devuelve el objeto que representa al nodo local. static InetAddress getByName(String nomNodo) Devuelve el nombre del nodo que se le pasa. Puede lanzar UnknownHostException (excepción de nodo desconocido). static InetAddress[] getAllByName(String nomNod) devuelve una matriz que representa todas las direcciones en las que se traduce un nombre dado. Fundamentos Puede lanzar UnknownHostException. 16 de Telemática Área de Ingeniería Telemática Universidad de Sevilla import java.net.InetAddress; class dire{ public static void main(String args[]) { InetAddress direccion; try{ direccion = InetAddress.getLocalHost(); System.out.println(direccion); System.out.println(); direccion = InetAddress.getByName("trajano.us.es"); System.out.println(direccion); System.out.println(); InetAddress SW[] = InetAddress.getAllByName("trajano.us.es"); for(int i = 0; i<SW.length; i++) System.out.println(SW[i]); }catch (Exception e){ System.out.println("Error en ejecución: "+e); } } } /* [16]-adriano:Mon> java dire adriano/193.147.162.138 trajano.us.es/193.147.162.130 trajano.us.es/193.147.162.130 Fundamentos [17]-adriano:Mon> de*/Telemática Área de Ingeniería Telemática 17 Universidad de Sevilla Métodos no estáticos String getHostName() Devuelve como cadena el nombre del nodo. byte[] getAddress() Devuelve una matriz de bytes de cuatro elementos que representa la dirección en Internet del objeto en el "orden de bytes de la red". String toString() Devuelve el nombre del nodo y la dirección IP. Ejemplo, "starwave.com/192.147.170.6". boolean equals(InetAddress otroNodo) Fundamentos Devuelve true si los objeto tiene la misma dirección. 18 de Telemática Área de Ingeniería Telemática Universidad de Sevilla Socket Socket: Comunic. de bajo nivel. URL y URLConnection: Comunic. de alto nivel. Sobre TCP, cada programa establece una conexión (cliente-servidor) y va ligado a un socket. Los socket son puntos finales del enlace. Los procesos los trata como descriptores de ficheros. El Cliente conoce: el nombre la máquina servidora número de puerto al que está conectado El Servidor: Fundamentos Acepta la conexión de Telemática Área de Ingeniería Telemática Universidad de Sevilla 19 Modelo de Comunicaciones Servidor Cliente ServerSocket(#port) Socket(host,#port) accept() OutputStream OutputStream InputStream InputStream close() close() Fundamentos de Telemática Área de Ingeniería Telemática 20 Universidad de Sevilla Constructores para el cliente Cuando se crea un objeto Socket, se establece una conexión entre cliente y servidor. Socket(String nodo, int puerto) Crea un conector que conecta el nodo local con el nodo y puerto especificados. Socket(InetAddress dirección, int puerto) Crea un conector utilizando un objeto InetAddress ya existente y un puerto. En total son 8 constructores (versión 1.2). Puede lanzar UnknownHostException o IOException. Fundamentos de Telemática Área de Ingeniería Telemática Universidad de Sevilla 21 Información del Socket y flujos InetAddress getInetAddress() Devuelve la InetAddress asociada con el objeto Socket. int getPort() Devuelve el puerto remoto al que está conectado este objeto Socket. int getLocalPort() Devuelve el puerto local al que está conectado este objeto Socket. InputStream getInputStream() Devuelve el InputStream (flujo de entrada) asociado con este conector. OutputStream getOutputStream() Devuelve el OutputStream (flujo de salida) asociado con este conector. void close() Cierra el InputStream y el OutputStream. Fundamentos de Telemática Área de Ingeniería Telemática 22 Universidad de Sevilla Constructores para el Servidor ServerSocket(int puerto) Crea un conector en el servidor en un puerto específico. ServerSocket(int puerto, int backlog) Se configura la longitud máx. de la cola de entrada. ServerSocket(int port, int backlog, InetAddress dir) Ligada a una dirección. Fundamentos de Telemática Área de Ingeniería Telemática 23 Universidad de Sevilla Creación de flujos de Entrada En el cliente se crea un flujo de entrada para recibir las respuestas del servidor (DataInputStream) Socket sock = new Socket(“host”,puerto); DataInputStream in = new DataInputStream(sock.getInputStream()); DataInputStream tiene métodos como read(), readLine(), readChar(), readInt(), … En el servidor también, para recibir a los clientes ServerSocket sock = new ServerSocket(puerto); Fundamentos de Telemática Área de Ingeniería Telemática 24 Universidad de Sevilla Creación de flujos de Salida En el cliente se crea un flujo de salida para enviar información al servidor (DataOutputStream o PrintStream) PrintStream out = new PrintStream(sock.getOutputStream()); DataOutputStream out = new DataInputStream(sock.getOutputStream()); PrintStream tiene los métodos write y println. DataOutputStream escribe los datos primarios y writeBytes. En el servidor se envía información al cliente PrintStream out = new PrintStream(sock.getOutputStream()); Fundamentos de Telemática Área de Ingeniería Telemática 25 Universidad de Sevilla import java.net.*; import java.io.*; class Whois{ public static void main(String args[]) throws Exception{ int c; Socket s = new Socket("intermic.net",43); InputStream in = s.getInputStream(); OutputStream out = s.getOutputStream(); String str = (args.length==0 ? ”starwave.com”: args[0]+"\n”); byte buf[] = new byte[str.length()]; str.getBytes(0,str.length(), buf, 0 ); out.write(buf); while((c = in.read()) != -1) { System.out.println((char)c); } s.close(); in.close(); out.close(); } } Fundamentos 26 de Telemática Área de Ingeniería Telemática Universidad de Sevilla import java.io.*; import java.net.*; public class EchoClient { public static void main(String[] args) throws IOException { Socket echoSocket = null; PrintWriter out = null; BufferedReader in = null; try { echoSocket = new Socket("adriano", 7);//crea un socket // dos siguientes lineas son para leer/escribir en socket out = new PrintWriter(echoSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream())); } catch (UnknownHostException e) { System.err.println("No conoce el host: adriano."); } catch (IOException e) { System.err.println("Error E/S en la conexion: adriano."); } Fundamentos de Telemática Área de Ingeniería Telemática Continúa ... 27 Universidad de Sevilla Continuación … if(echoSocket!=null&& in!=null && out!=null){ BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); String userInput; while ((userInput = stdIn.readLine()) != null) { out.println(userInput); System.out.println("echo: " + in.readLine()); } out.close(); in.close(); stdIn.close(); echoSocket.close(); } } } Fundamentos de Telemática Área de Ingeniería Telemática 28 Universidad de Sevilla URL (Uniform Resource Locator) Referencia (dirección) de un recurso de Internet. http://java.sun.com Nombre del recurso Identificador de protocolo Protocolos: HTTP, FTP, Gopher, File y News. Nombre del recurso: Nombre host Nombre fichero Número de Puerto Fundamentos Referencia Nombre de la máquina en la que está el recurso. Nombre del camino al fichero en la máquina. Puerto al que se conecta (opcional). Referencia al nombre (opcional). 29 de Telemática Área de Ingeniería Telemática Universidad de Sevilla Constructores (I) URL absoluto, contiene toda la información para alcanzar el recurso URL(String cad), ejemplo URL gamelan = new URL("http://www.gamelan.com/"); URL relativo, los ficheros HTML dan de forma relacionada con el fichero en el que están. URL(URL base ,String relativo), ejemplo URL game = new URL("http://www.gamelan.com/pages/"); URL gamelan = new URL(game,”Gamelan.html"); Fundamentos de Telemática Área de Ingeniería Telemática 30 Universidad de Sevilla Constructores (y II) URL(String proto, String host, int port, String file) URL(String proto, String host, String file) URL gam = new URL ("http", ”www.gamelan.com”, 80, "/pages/Gamelan. html"); Crea un objeto URL para el siguiente URL: http://www.gamelan.com:80/pages/Gamelan.network. html MalformedURLException Si el protocolo es desconocido o los argumentos del constructor son incorrectos. Los objetos URL se escriben una vez (no se pueden 31 Fundamentos de Telemática cambiar). Área de Ingeniería Telemática Universidad de Sevilla Métodos String getProtocol() Devuelve el componente identificador de protocolo del URL String getHost() Devuelve el nombre de host del URL int getPort() Devuelve el número de puerto del componente URL. Devuelve un entero que es el número de puerto. Si el puerto no es asignado explicitamente devuelve -1. String getFile() Devuelve el nombre del fichero del componente del URL. String toExternalForm() Devuelve una cadena que representa un URL. Fundamentos de Telemática Área de Ingeniería Telemática 32 Universidad de Sevilla Ejemplo import java.net.*; class Patric{ public static void main(String args[]) throws MalformedURLException{ URL hp = new URL ("http://www.starwave.com/people/naughton/"); System.out.println("Protocolo: "+ hp.getProtocol()); System.out.println("Puerto: "+ hp.getPort()); System.out.println("Nodo: "+ hp.getHost()); System.out.println("Archivo: "+ hp.getFile()); System.out.println("Ext: "+ hp.toExternalForm()); } } /* Protocolo: http Puerto: -1 Nodo: www.starwave.com Archivo: /people/naughton/ Ext: http://www.starwave.com/people/naughton/ */ Fundamentos de Telemática Área de Ingeniería Telemática 33 Universidad de Sevilla Conexión a un URL URLConnection openConnection() import java.net.*; import java.io.*; class URL0{ public static void main(String args[]) { try{ URL yahoo = new URL ("http://www.yahoo.com/"); yahoo.openConnection(); System.out.println("OK "); }catch(MalformedURLException e){ System.out.println("Excep: " + e); }catch(IOException e){ System.out.println("Excep: " + e); } } } Fundamentos de Telemática Área de Ingeniería Telemática 34 Universidad de Sevilla Leyendo de un URL InputStream openStream() import java.net.*; import java.io.*; class URL1{ public static void main(String args[]) throws Exception{ URL yahoo = new URL ("http://www.yahoo.com/"); BufferedReader in = new BufferedReader( new InputStreamReader(yahoo.openStream())); String inputLine; while((inputLine = in.readLine())!= null) System.out.println(inputLine); in.close(); } } Fundamentos de Telemática Área de Ingeniería Telemática 35 Universidad de Sevilla Leyendo de un URLConnection InputStream getInputStream() import java.net.*; import java.io.*; class URL2{ public static void main(String args[]) throws Exception{ URL yahoo = new URL ("http://www.yahoo.com/"); URLConnection yc = yahoo.openConnection(); BufferedReader in = new BufferedReader( new InputStreamReader(yc.getInputStream())); String inputLine; while((inputLine = in.readLine())!= null) System.out.println(inputLine); in.close(); } Fundamentos } de Telemática Área de Ingeniería Telemática 36 Universidad de Sevilla Datagramas Los Datagramas se implementan sobre el protocolo UDP, con dos clases: DatagramPacket, contiene los datos DatagramSocket, es el mecanismo para enviar o recibir los DatagramPacket. Fundamentos de Telemática Área de Ingeniería Telemática 37 Universidad de Sevilla Métodos InetAddress getAddress() Devuelve la dir. de destino (para envíos) int getPort() Devuelve el número de puerto. byte[] getData() Devuelve el contenido del datagrama int getLength() Devuelve la longitud de los datos válidos Fundamentos de Telemática Área de Ingeniería Telemática 38 Universidad de Sevilla