Universidad Simón Bolívar Departamento de Computación y T.I. Taller de Redes de Computadoras I Enero-Marzo 2010 Proyecto 3 Programación de aplicaciones Cliente/Servidor Objetivos: Modificar el proyecto 2 para que use RMI para la comunicación entre Cliente/Servidor en lenguaje Java. Introducción La introducción es la misma del proyecto 2, el programa debe realizar lo mismo, solo que en vez de implementar la comunicación entre cliente-servidor con socket debe realizarse en RMI. En la actualidad, existen grandes colecciones de fotografía en Internet como Corbis y Getty Images que venden los derechos de reproducir fotos a publicistas, diseñadores gráficos y otros interesados en adquirir imágenes. Estos sitios permiten navegar en la colección de fotos y buscar imágenes en base a categorías, palabras clave y otros criterios. Luego los derechos de reproducir las fotografías seleccionadas, de forma irrestricta o un cierto número de veces, son vendidos a los usuarios. Un grupo de fotógrafos se ha puesto de acuerdo para organizar un repositorio de imágenes peer-to-peer con el fin de intercambiar libremente fotos tomadas por ellos. Esta red está formada por varios nodos, cada uno de los cuales le pertenece a un usuario. Un nodo es una aplicación de red cuyo servicio consiste en ofrecer fotografías almacenadas localmente en la computadora del usuario a otros nodos de la red. Los nodos estarán interconectados entre ellos con el fin de compartir información. A través de una aplicación de consulta, un usuario puede interrogar a otros nodos de la red sobre las fotografías disponibles, y descargar las fotografías que le interesen. Esta aplicación será llamada fotos a lo largo del enunciado. Arquitectura del sistema Como se dijo anteriormente, el sistema tendrá una arquitectura peer-to-peer. No habrá en general un nodo que tenga todas las fotografías, sino que éstas estarán repartidas entre los nodos de la red. De hecho, no se espera que haya redundancia en el almacenamiento: en general, una misma foto no estará repetida en dos nodos distintos. Por otra parte, cada nodo tendrá un cierto número de nodos vecinos. Que un nodo B sea vecino de A significa que A conoce la dirección o nombre de B. En general no existirá un nodo que conozca la dirección de todos los nodos. Al contrario, un nodo
tendrá una cierta vecindad y sólo conocerá la dirección o nombre de otros nodos de la red de forma indirecta. Esta estructura de red puede ser representada fácilmente como un grafo dirigido en donde cada nodo de la red equivale a un nodo del grafo y donde existe una arista del nodo A al nodo B ssi B es vecino de A 1. En la figura se muestra un ejemplo de red. Algoritmo de búsqueda El algoritmo a utilizar consiste en una búsqueda en profundidad distribuida. Cuando el programa fotos realiza una consulta a un nodo, este nodo debe buscar entre sus fotografías almacenadas aquellas que satisfagan el criterio de búsqueda. Seguidamente, el nodo le debe pasar la consulta a sus nodos vecinos, quienes buscan entre sus fotografías almacenadas y le pasan la consulta a sus vecinos. Este proceso continúa hasta que todos los nodos alcanzables desde el nodo inicial hayan sido visitados. Note que cuando un nodo haya obtenido sus resultados y el de todos sus vecinos, debe retornárselos al nodo que le envió la consulta, de existir uno. Por otra parte, es importante que al implementar el algoritmo usted diseñe un mecanismo que garantice que cada nodo alcanzable sea visitado exactamente una vez. Consultas Una fotografía tendrá asociada la siguiente información: Título Autor Descripción Palabras clave Stop (f1.4, f2, etc.) Tiempo de exposición (en milisegundos) Película (blanco y negro o color) Por simplicidad, el programa fotos sólo permitirá realizar dos tipos de consulta: 1 Note que esta relación no es simétrica.
Por autor: una foto es relevante si su autor tiene como subcadena la cadena ingresada por el usuario. Por palabras clave: una foto es relevante si sus palabras clave incluyen como subcadena la cadena ingresada por el usuario. Estructura de directorio El programa nodo, al ser ejecutado, buscará en un directorio especificado las fotos a ser servidas, así como sus atributos. Las fotos estarán cada una en un archivo JPG. Para cada uno de estos archivos, existirá un archivo XML con el mismo nombre que indicará los atributos de la foto. Las fotos tendrán extensión.jpg y los archivos de atributos.xml. <?xml El elemento <foto> raíz del archivo XML tendrá como nombre foto, y dentro de él habrá un elemento para <titulo> version="1.0" encoding="iso-8859-1"?> cada uno de los atributos de la foto mencionados anteriormente. Las palabras clave se indicarán cada una un elemento separado. A continuación se presenta un ejemplo <titulo/> Título de la foto del formato XML que deben tener los archivos. <pelicula="color"/> <autor <descripcion> Un texto name="carlos algo largo Pérez"/> </descripcion> <palabrasclave> que está asociada a que la imagen tiene la información <entrada palabra="oceano"/> </foto> </palabrasclave> <exposicion palabra="costa tiempo="5" stop="f1.4"/> de Marfil"/> Protocolo Usted debe diseñar los protocolos de comunicación entre las distintas aplicaciones. Éstos deben cumplir las características vistas en clase de buen diseño de protocolos, como ser extensibles, tolerantes a fallas, bien estructurados e incorporar mensajes fácilmente leídos por los humanos. Utilice el lenguaje XML para definir los mensajes cuando sea conveniente. Al contrario que en el proyecto 2, puede enviar sí les hace falta objetos de tipo XMLElements, entre los componentes del sistema.
Interfaz de fotos: La aplicación fotos recibirá las acciones a realizar en forma interactiva siguiendo la definición de los siguientes comandos: Para las consultas: C {-t <cadena> -k <cadena>} Donde: -t especifica que la consulta se realizará sobre títulos de las imágenes -k especifica que la consulta se realizará sobre las palabras claves. <cadena> es una cadena de caracteres que se refiere al patrón a buscar. Petición de fotos: D servidor:nombrearchivo Donde: servidor es el nombre o dirección que identifica a un servidor en la red. nombrearchivo: es el nombre del archivo que se debe solicitar al servidor especificado. Petición de número de nodos alcanzables: A Salida Q Note que los comandos deben ser reconocidos en minúsculas o mayúsculas. puede haber al menos un espacio en blanco entre cada par de elementos consecutivos de un comando, es decir, entre el comando y sus parámetros y entre éstos. Ejecución de los programas Fotos Línea de comandos: $ fotos -s <máquina servidor> -p <puerto> Donde
<servidor>: es el nombre o dirección IP del nodo al que se conectará fotos para hacer las solicitudes. <puerto>: es el puerto por el cual estará escuchando el programa nodos en la máquina servidor Nodos Línea de comandos: $ nodo -p <puerto> -f <maquinas> -l <archivotrazas> -d <directorio> Donde <puerto>: es el puerto por el cual estará escuchando el servidor. <maquinas>: es el nombre del archivo donde estarán especificados los nombres o direcciones IP de los nodos vecinos <archivotrazas>: nombre del archivo de texto donde el servidor escribirá la información sobre las operaciones realizadas: consultas recibidas, de quién las recibió, petición de archivos, etc. <directorio>: nombre del directorio donde estarán los archivos JPG y XML que representan las fotos, como se explicó anteriormente. Sobre los Shell Script Para cada una de las aplicaciones definidas en este enunciado, Ud. debe implementar un Shell Script (SS) sencillo que permita encapsular la definición de variables de ambiente necesaria para la ejecución de las aplicaciones: CLASSPATH y PATH. Luego debe hacer la invocación de los comandos necesarios. Recuerde que sus proyectos pueden ser #!/bin/bash corridos en cuentas que no tendrán necesariamente configuraciones compatibles con los requerimientos de su aplicación. Estos shell scripts tienen como función establecer el ambiente necesario para la ejecución de sus aplicaciones. A continuación # un ejemplo de cómo sería el para el comando fotos, asumiendo que la clase principal export en el CLASSPATH=nano-xml-lite.jar:dir1:dir2:. directorio esta instalado el OpenJDK se llama PATH=$PATH:/usr/bin Fotos.java: java Fotos $* Recuerde colocar permiso de ejecución a los shell script.
Sobre la entrega del proyecto Los programas deben ser escritos en lenguaje Java usando el JDK instalado en las máquinas del LDC. Asegúrese de especificar esto en los shell scripts que escriba de manera que su aplicación pueda correrse sin problemas. Para establecer comunicación entre los diferentes componentes del sistema, Ud. debe usar RMI. La manipulación de archivos y mensajes XML debe hacerse usando la biblioteca anoxml/lite 2.2.3 publicada en Aula Virtual. También se encuentra publicada una pequeña documentación de esta biblioteca. La entrega se debe realizar de la siguiente forma: El archivo tar.gz hasta el día domingo 21 de marzo a las 11 pm. El sobre con el código e informe impresos el día lunes 22 de marzo al comienzo de la hora de clases. El informe, que debe tener máximo cinco páginas, debe explicar los siguientes puntos: Diseño del protocolo Estado del proyecto otas adicionales Para efectos de implementación, cada grupo puede usar como puerto los números de cinco dígitos de la forma ZXXXX donde XXXX deben ser los últimos cuatro dígitos del carnet de uno de los integrantes de equipo y Z cualquier dígito. El archivo tar.gz que entregue debe tener un archivo Makefile que permita compilar los componentes del sistema. La corrida del proyecto forma parte importante de la evaluación (los proyectos que no corran no serán corregidos). El programa debe poder correr en cualquiera de las estaciones Linux del LDC. Los formatos, nombres de los comandos, etc., deberán ser estrictamente los especificados en este enunciado. Por simplicidad se pide que no se implemente ningún tipo de interfaz gráfica.