laboratorio de programación práctica 3 entrada/salida y manejo de excepciones dpto. de ingeniería...
TRANSCRIPT
Laboratorio de Programación
Práctica 3Entrada/Salida y
Manejo de excepciones
Dpto. de Ingeniería de Sistemas Telemáticos
http://www.lab.dit.upm.es/~lprg/
Abril 2004
Abril 2004 Práctica 3 2
Objetivos
Se cubren los siguientes aspectos Lectura de un fichero de entrada Manejo de excepciones
Escenario Configuración de un router
Abril 2004 Práctica 3 3
Internet: red de “redes”
Estaciones de usuario (PC)
Servidores
Router
A
B
Camino que va siguiendoel tráfico de la comunicacióndel PC A al servidor B (ruta)
Conexión entre dispositivos,a través de una red
R1R2
R3
R4
R5
Abril 2004 Práctica 3 4
Un router es un dispositivo con conexiones a otros dispositivos a través de redes y que actúa como encaminador de tráfico.
Cada conexión se realiza a través de una interfaz, que es el punto de comunicación entre un dispositivo y el exterior.
Para encaminar el tráfico es necesario conocer las rutas hacia los posibles destinos no la ruta completa, sólo el “gateway” o “siguiente salto”. (R1
sólo necesita saber que para encaminar el tráfico dirigido hacia B, hay que enviarlo a R2)
Router
Abril 2004 Práctica 3 5
En Internet, se necesita “algo” para identificar unívocamente las interfaces y redes. Para ello se utilizan las direcciones IP (Internet Protocol) Formada por 4 bytes
Cada byte permite 28 valores, entre 0 y 255 Notación
Notación decimal: 138.4.54 4 Notación binaria: 1111 1111 0000 0100 0111 0110 0000 0100
Dirección IP
138 4 54 4
1000 1010 0000 0100 0011 0110 0000 0100
Abril 2004 Práctica 3 6
Una dirección de red identifica el conjunto de direcciones IP posibles de las interfaces conectadas en una red
El procedimiento empleado es hacer que todas las direcciones IP de una red tengan una parte común: los primeros N bits
Esa parte común se representa mediante una máscara de red La máscara de red se representa como una dirección IP, con los primeros N bits
igual a 1 y el resto de bits 0, ej. 255.255.255.0
Por tanto, una dirección de red queda definida mediante: dirección IP, máscara de red
Dirección de Red
Ej. Red de área local con un router y varios servidores: 138.4.54.0 / 255.255.255.0
138.4.54.1
138.4.54.2 138.4.54.3 138.4.54.x
Abril 2004 Práctica 3 7
Una interfaz, se identificará por: un nombre, de uso interno en el dispositivo (ej, ce0) una Dirección IP (ej, 138.4.54.4) un identificador de la red a la que está conectada (dirección de la red)
La dirección de red se genera a partir de: Dirección IP (ej, 138.4.54.4) una Máscara de Red (ej, 255.255.255.0)
Por tanto, una interfaz queda definida mediante: nombre, dirección IP, máscara de red
Interfaz
138.4.54.4 / 255.255.255.0
ce0
Abril 2004 Práctica 3 8
Para encaminar el tráfico es necesario conocer las rutas hacia los posibles destinos
Dos casos: Si el destino está en una de las redes a las que estoy conectado
directamente, se lo envío directamente a través de esa red. Si el destino no está en una de las redes a las que estoy conectado
directamente, se lo intentaré enviar indirectamente a través de otro router con el que sí tengo conexión directa.
Un router guarda información sobre las rutas que conoce (tabla de encaminamiento). Cada ruta especifica: dirección de la red destino (= dirección IP + máscara) dirección IP del “gateway” (dispositivo al que tengo que reenviar el
tráfico dirigido a cualquier dirección de esa red destino) Por tanto, una ruta queda definida mediante:
dirección de red (destino), dirección IP (gateway)
Rutas
Abril 2004 Práctica 3 9
Parámetros de un Router
Un router queda definido por: Su nombre Sus interfaces de red; cada interfaz queda definida por:
Un nombre Una Dirección IP Una Máscara de red
Su tabla de rutas; cada ruta queda definida por: Red destino (Dirección de Red) Gateway (Dir. IP)
Abril 2004 Práctica 3 10
Fichero de configuración
// nombre del router
device name "my router"
// definición de interfaces
interface add ce0 "192.168.0.3" "255.255.0.0"
interface add ce1 "10.0.0.5" "255.0.0.0"
interface add ce2 "138.4.54.4" "255.255.255.0"
// definición de rutas
route add "11.0.0.0" "255.0.0.0" "10.0.0.1"
route add "212.166.250.0" "255.255.0.0" "192.168.0.1"
route add "138.4.63.0" "255.255.255.0" "138.4.54.1"
Abril 2004 Práctica 3 11
¿Qué hay que hacer?
Implementar una clase que lea un fichero de configuración de un router, como el anterior, y cree un router con dicha configuración
Abril 2004 Práctica 3 12
Diagrama de Clases
Abril 2004 Práctica 3 13
Clases
Clases (y ficheros) proporcionados: Clase DireccionIP.java Clase DireccionIPException.java Clase DireccionRed.java Clase Interfaz.java Clase Ruta.java Clase Router.java Clase Configuracion.java Fichero de ejemplo de configuración: Device.txt Clase Entrega.java
Clases pedidas: Clase ConfigRouterException.java Clase ConfigRouter.java Clase ConfigRouterTest.java
Abril 2004 Práctica 3 14
Entrada/Salida para ConfigRouter
Para leer el fichero java.io.File(nomfichero) java.io.FileReader(File)
Para descomponer la entrada en tokens java.io.StreamTokenizer
Abril 2004 Práctica 3 15
final char DELIMITADOR_WORD = ‘”’;fr = new FileReader (new File(“fichero”));st = new StreamTokenizer(fr);
// una secuencia de caracteres encerrada // entre dos caracteres DELIMITADOR_WORD es//vista como un solo tokenst.quoteChar(DELIMITADOR_WORD)
// ignora comentarios del tipo “//”st.slashslashComments(true)
// ignora comentarios del tipo “/*...*/”st.slashStarComments(true)
StreamTokenizer
Abril 2004 Práctica 3 16
Método nextTokende StreamTokenizer
El método nextToken() de StreamTokenizer puede devolver varios valores: TT_WORD: indica que el token es una palabra. TT_NUMBER: indica que el token es un número. TT_EOL: indica que se ha llegado al final de una línea.
Para que esto funcione, debe haber sido invocado el método eolIsSignificant con el argumento true.
TT_EOF: indica el final de la entrada.
Abril 2004 Práctica 3 17
Ejemplo trivial
devicenamemy routerinterfaceaddce0192.168.0.3255.255.0.0interfaceAddce110.0.0.5255.0.0.0interfaceaddce2138.4.54.4255.255.255.0routeadd
11.0.0.0255.0.0.010.0.0.1routeadd212.166.250.025.255.0.0192.168.0.1routeadd138.4.63.0255.255.255.0138.4.54.1
// _st es un objeto de la clase StreamTokenizer
for (int lexema = _st.nextToken(); lexema != StreamTokenizer.TT_EOF;
lexema = _st.nextToken())
System.out.println (_st.sval);
Abril 2004 Práctica 3 18
Palabras Clave
Las palabras clave utilizadas en la definición de un router son las siguientes: device interfaz route
Además, existen otras dos palabras clave, que representan operaciones: name add
Abril 2004 Práctica 3 19
Posible algoritmo de reconocimiento:método configura
Abrir fichero para lectura Crear StreamTokenizer Leer una primera línea que comience por device
Si el siguiente token es name tratar de reconocer un nombre para el router
Mientras haya tokens Si el primer token es interfaz
Si el siguiente token es add• Tratar de reconocer una definición de interfaz para el router
Si el primer token es router Si el siguiente token es add
• Tratar de reconocer una definición de Ruta para el dispositivo
Si en algún momento se llega a una situación no deseada (token incorrecto, fin de línea, etc.) se debe lanzar una Excepción: ConfigRouterException.
Abril 2004 Práctica 3 20
Sugerencias
Crear los siguientes métodos getWord, para leer una palabra (o secuencia de palabras
entrecomilladas) getDireccionIP, para leer una dirección IP procesaNombre, para leer líneas que comiencen por device procesaInterfaz, para leer líneas que comiencen por interfaz procesaRuta, para leer líneas que comiencen por route
Abril 2004 Práctica 3 21
Logging
Se deberán incluir trazas en la implementación de la clase pedida ConfigRouter: se utilizará java.util.logging niveles de trazado:
SEVERE: para fallos graves, como excepciones que no se pueden tratar; se indica la excepción que se lanza.
INFO: para mostrar información de alto nivel: entrada y salida en los métodos.
FINE: para mostrar información de bajo nivel, concretamente de los tokens que se van leyendo de la entrada.
Se puede indicar en tiempo de ejecución dónde está el fichero de configuración para el paquete java.util.logging: java -Djava.util.logging.config.file=logging.properties
lprg.p3.ConfigRouterTest
Abril 2004 Práctica 3 22
Logging: Ejemplos
11-abr-2004 23:42:17 lprg.p3.ConfigRouter getWord
INFO: Entrada
11-abr-2004 23:42:17 lprg.p3.ConfigRouter getWord
FINA: token leído: device
11-abr-2004 23:42:17 lprg.p3.ConfigRouter getWord
INFO: Entrada
11-abr-2004 23:42:17 lprg.p3.ConfigRouter getWord
FINA: token leído: name
....
11-abr-2004 23:46:40 lprg.p3.ConfigRouter getWord
INFO: Entrada
11-abr-2004 23:46:40 lprg.p3.ConfigRouter getWord
FINA: token leído: 1192.168.0.3
11-abr-2004 23:46:40 lprg.p3.ConfigRouter getDireccionIP
GRAVE: Lanzada ConfigRouterException
Abril 2004 Práctica 3 23
Pruebas: Clase Configuracion.java
Existe una clase Configuración.java que permite comprobar la funcionalidad del Router:
Crea un router a partir de un fichero de configuración Calcula rutas para algunas direcciones IP predefinidas en el código Solicita direcciones IP por la entrada estándar y dice por qué interfaz deberá
encaminarse el tráfico dirigido hacia esa dirección IP
java lprg.p3.Configuracion –Djava.util.logging.config.file=logging.properties lprg\p3\Device.txt138.4.54.38 -> ce2: 138.4.54.4/255.255.255.010.0.3.0 -> ce1: 10.0.0.5/255.0.0.0192.168.0.1 -> ce0: 192.168.0.3/255.255.0.0192.160.0.1 -> nulldevice name my router"
interface add ce0 "192.168.0.3" "255.255.0.0"interface add ce1 "10.0.0.5" "255.0.0.0"interface add ce2 "138.4.54.4" "255.255.255.0"
route add "11.0.0.0" "255.0.0.0" "10.0.0.1"route add "212.166.250.0" "25.255.0.0" "192.168.0.1"route add "138.4.63.0" "255.255.255.0" "138.4.54.1"
Introduzca direcciones IP para averiguar la ruta:138.4.54.1 -> ce2: 138.4.54.4/255.255.255.0212.166.250.21 -> ce0: 192.168.0.3/255.255.0.0
Abril 2004 Práctica 3 24
Excepcionesen ConfigRouter.java
Deben lanzarse excepciones: IOException: si no se puede abrir el fichero porque no existe o
no tenemos permisos ConfigRouterException: no se reconoce el tipo de elemento de
una línea
Tratamiento: IOException: no se pueden tratar, el programa debe terminar ConfigRouterException: tampoco se tratan, el programa termina DireccionIPException deben capturarse y propagarse en forma
de RouterException
Cada vez que se lance una Excepción se generará una línea de log con el nivel SEVERE
Abril 2004 Práctica 3 25
Pruebas enConfigRouterTest.java
Se proporcionan algunas pruebas muy simples: Fichero vacío Fichero que no existe
Deberá completarse con casos de prueba adicionales que permitan comprobar toda la funcionalidad de la clase ConfigRouter
¿Cómo escribir en un fichero?
FileWriter fw = new FileWriter(<nomfichero>);
BufferedWriter salida = new BufferedWriter(fw);
salida.write(<String>);
salida.write (<String>);
...
salida.close();
Abril 2004 Práctica 3 26
Entrega
Todas las clases pertenecerán al package lprg.p3 Se deberán dejar en el directorio lprg/p3 de su cuenta del
laboratorio Se piden los ficheros
ConfigRouter.java ConfigRouterException.java ConfigRouterTest.java
Fecha límite: 30 de abril de 2004, 23:59