+----------------------------+ | PROPUESTA DE SERVIDOR v0.2 | +----------------------------+ $Id$ Leandro Lucarella (creado el 18/10/2003) Descripción General: ==================== El servidor estará dividido en 2 módulos que provean 2 servicios diferentes: Módulo de Control: ------------------ El módulo de control se basa en el protocolo TCP y se encarga de listar los archivos de planta disponibles en el servidor, permitiendo cambiar las propiedades de cada uno y conocer su estado en términos generales (si se está simulando o no). Todo lo que sean comandos (abrir una exclusa, parar una bomba, etc) se realizan a través de este módulo. El protocolo utilizado es una implementación limitada e incompleta de HTTP 1.1. Solo se implementan los métodos POST y GET, tomando solo en cuenta la ruta del archivo a obtener (se ignora el 'query string' de GET y los datos recibidos por POST). Cada comando se representa a través de una ruta a un archivo. Si el comando recibe parámetros, estos parámetros son también representados como componentes de dicha ruta. A cada comando se responde con una respuesta HTTP 1.1 (también a través de una implementación incompleta y limitada). El cuerpo de la respuesta es un archivo XML de texto plano en formato XML que contendrá la información requerida por el comando (ya sea una lista de archivos o una respuesta informando el éxito o error al cambiar las propiedades de una planta). Módulo de Transmisión: ---------------------- Este módulo se encarga de transmitir la simulación en tiempo real por UDP (como si fuera un video). Comienza luego de que el módulo de control recibe una petición de transmisión y continúa transmitiendo (en un principio) hasta que recibe una petición de desconexión. Lo que se envía es un archivo XML con el estado de la planta. El cliente debe validar lo recibido y mostrar todos los 'frames' válidos. Mientras que no se reciban 'frames' válidos se debe mostrar el último válido. Si no se recibiece durante una cantidad de tiempo determinada ningún 'frame' válido, se asume un error en la red. Si por casualidad los datos recibidos son incorrectos pero válidos (por ejemplo, se recibe el comienzo de un 'frame' y el final del siguente), el cliente lo mostrará igual porque no tiene forma de darse cuenta. Esto no es problema si consideramos que en pocos milisegundos se recibirá un nuevo 'frame' válido y correcto (similar a lo que pasa en transmisiones de audio o video en tiempo real). Lista de comandos disponibles para el módulo de control: ======================================================== Todos los comandos son rutas de archivos. En un principio no se van a utilizar los 'query string' de los datos pasados por GET ni datos adicionales pasados por POST. Es decir, de un 'request' HTTP solo se usara la ruta para codificar los comandos. Ejemplo: GET /ruta/que/representa/comando?query=string HTTP/1.1 '----------------------------' Este es el comando que entendera el servidor. La presencia de un 'query string' sera ignorada, al igual que datos enviados por POST, silenciosamente (sin producir un error). Todos los comandos son respondidos con una respuesta XML que *siempre* incluye un código de éxito/error. Adicionalmente puede devolver más datos en la respuesta en cuyo caso se especifica expresamente. Comandos Generales: ------------------- Los nombres entre "<" y ">" denotan un argumento. Comando |Descripción |Respuesta ----------------------+----------------------+---------------------------------- / |Obtiene estado general|Cantidad de plantas, |del servidor. |conexiones, transmisiones, | |versión, uptime, etc. ----------------------+----------------------+---------------------------------- /plants |Obtiene lista de |Lista de plantas con info mínima |plantas. |de cada una (está corriendo o no, | |uptime, cantidad de elementos,etc) ----------------------+----------------------+---------------------------------- /plants/ |Obtiene la planta de |El mismo archivo que se crea en el |nombre . |Constructor. ----------------------+----------------------+---------------------------------- /transmissions |Obtiene una lista de |Lista de transmisiones activas |las transmisiones |(host, puerto, uptime, etc). |activas. | Comandos para una Planta: ------------------------- Todos los comandos de plantas comienzan con /plants/ y reciben un argumento que es el nombre de la planta, , a la cual enviar el comando. Los comandos a continuación comienzan todos con '/plants/'. Comando |Descripción |Respuesta ----------------------+----------------------+---------------------------------- /start |Comienza la simulación|Nada. |de la planta de nombre| |. | ----------------------+----------------------+---------------------------------- /start |Finaliza la simulación|Nada. |de la planta de nombre| |. | ----------------------+----------------------+---------------------------------- /set///|Cambia la propiedad |Nada (a ver si no retorna el valor | del elemento |realmente aceptado). |, asignándole | |el valor . | Comandos para una Transmisión: ------------------------------ Todos los comandos de transmisiones comienzan con /transmissions. Los comandos a continuación comienzan todos con '/transmissions'. Los argumentos entre "[" y "]" son opcionales. De omitirse se usan valores por predefinidos. Comando |Descripción |Respuesta ------------------------+--------------------------------------------+---------- /start//[] |Comienza la transmisión al en el |Nada. |puerto al en el puerto . | ------------------------+--------------------------------------------+---------- /stop/[]/[] |Finaliza la transmisiónal en el |Nada. |puerto . Si se omite el , se | |finalizan todas las transmisiones. | Características adicionales (a desarrollar si el tiempo lo permite): ==================================================================== Hojas de estilo XSLT: --------------------- Es factible crear hojas de transformación de XML a HTML para enviar con las respuestas XML del módulo de control, de forma tal que pueda controlarse la planta desde un navegador web que soporte esto (como Mozilla). Las hojas de estilos estarían en la ruta /web, al igual que imágenes y otros archivos complementarios. Módulo de Transmisión sobre TCP: -------------------------------- Opcionalmente se puede hacer un Módulo de transmisión sobre TCP, que sólo envíe el estado actual de la planta en ese instante y se desconecte, o directamente implementarlo como un comando del módulo de control para poder verlo en un navegador web. Aunque esto ya sería más un cliente que un servidor. 'keep-alive' para el Módulo de Transmisión: ------------------------------------------- En el futuro se puede agregar una respuesta de tipo 'keep-alive' para que el transmisor UDP deje de transmitir a un host si no recibe una señal del receptor cada una cantidad de tiempo determinada. De esta manera se evita seguir transmitiendo si un cliente se cierra sin enviar el comando de fin de transmisión por el Módulo de Control. Envío por 'broadcast' del módulo de transmisión: ------------------------------------------------ Es posible hacer que el comando /transmissions/start sin argumentos comience una transmisión por 'broadcast' de la planta para todo aquel que quiera monitorearla desde la red en la que se haga el 'broadcast'. vim: set et ts=4 sw=4 tw=80: