1.- Beep Generador - Java RMI El objetivo de este ejercicio es producir un programa cliente-servidor basado en el mecanismo Java Remote Method Invocation (RMI). El servidor debe soportar un servicio de generación de sonidos que puede emitir un cierto número de “beeps” cada vez que reciba la invocación de un cliente. Tanto el cliente como el servidor serán escritos en Java. Desarrollo de la aplicación Para el desarrollo del sistema descrito siga las siguientes instrucciones: 1.- Definición de la Interfaz – Defina la interfaz BeepGenerator en Java, la cual debe ser subclase de la interfaz java.rmi.Remote. Esta interfaz debe declarar el método emitBeep y su parámetro, de manera que sea accesible para los clientes. El parámetro debe indicar el número de beeps que se solicitan. Recuerde que todos los métodos remotos incluidos en una interfaz remota deben incluir la excepción java.rmi.RemoteException. 2.- Implementación del servidor.- Implemente la aplicación BeepServer que crea una instancia de sí mismo y la registra en el “RMI registry”. El servant debe proveer una implementación para el método emitBeep que emite el número solicitado de “beeps”. Sugerencia: puede utilizar el método java.awt.Toolkit.beep() para generar el sonido ó bien imprimir un mensaje que sustituya al “beep” si utiliza una máquina sin sonido. 3.- Generación de stub/skeleton.- Use la herramienta rmic para generar el código del stub y del skeleton a partir del servidor compilado BeepServer. 4.- Security Policy – El modelo de seguridad de java requiere la presencia de un archivo de políticas de seguridad para definir la autorización de las acciones de las aplicaciones. Para este ejemplo puede utilizar un archivo con el contenido siguiente: grant {permission java.security.AllPermission;}; Esta instrucción garantiza acceso total a las aplicaciones y solo debe utilizarse con fines de prueba. 5.- Implementación del cliente.- Implemente la aplicación BeepClient la cual debe primero obtener una referencia del objeto servidor BeepGenerator vía el “RMI registry”. Enseguida debe invocar el método emitBeep solicitando un cierto número de “beeps”. 6.- Ejecute la aplicación.- Ejecute primero el comando rmiregistry para iniciar el servicio de nombres, ejecute después el servidor y finalmente ejecute el cliente. 2.- Sum El objetivo de este ejercicio es producir un programa cliente-servidor basado en el mecanismo Java Remote Method Invocation (RMI). El servidor ofrece el servicio de sumar 2 números enteros y regresa el resultado al cliente. 3.- Count Con el objetivo de evaluar el desempeño de RMI se desea implementar un servidor simple. El servidor exporta un método que se llama increment () el cual solamente incrementa en 1 el valor de una variable de tipo int llamada sum y regresa el resultado al cliente. El servidor tiene otros 2 métodos, uno para leer y otro para modificar el valor de la variable sum. El cliente debe: 1) Inicializar a cero el valor de sum 2) Invocar 1000 veces el método increment () 3) Desplegar el valor final de sum y el tiempo promedio de respuesta. 4.- Power Service El objetivo es implementar un servicio con 2 métodos. Uno llamado square que calcula el cuadrado de un número entero dado y otro llamado power que eleva un número entero a cualquier potencia entera y regresa el resultado al cliente. Sugerencia, para elevar un número a una determinada potencia utilice la clase “BigInteger” o la clase “Math”. 5.- Factorial Programar un servidor RMI al cual los clientes puedan pasarle un número de tipo “long” y obtener en respuesta el factorial del número (de tipo “long”). 6.- LightBulb Escriba un programa servidor para el control de un foco. Los clientes deben poder encender y apagar el foco y preguntar su estado actual. 8.- Time Stamp Construya un servidor RMI que regrese al cliente la fecha y la hora de la invocación. 9.- Calculadora Construya un servidor que soporte las 4 operaciones aritméticas (suma, resta, multiplicación y división) manipulando variables de tipo long y regresando a los clientes un resultado de ese mismo tipo. 10.- Message El objetivo del ejercicio es crear un servidor al que los clientes se puedan conectar para enviar mensajes. Los mensajes incluyen el nombre del remitente y un texto. Al recibir la invocación el servidor imprime una línea con el siguiente formato “nombre: mensaje”. Resultando en una secuencia como la que se indica: Juan: Hola Pepe: Hola, ¿Qué tal? Juan: Bien,…. 11.- Banco Construya un servidor bancario simple. Suponga que solo hay un cliente que inicialmente tiene un balance cero y puede hacer depósitos y retiros (siempre y cuando el balance lo permita) 12.- Estadísticas I Diseñar un servidor de estadísticas de fútbol americano que responda a los clientes que se conecten la cantidad de yardas ganadas por tierra (running), la cantidad de yardas ganadas por pases (passing) y el número de intercambios de balón por error (turnover). (Los métodos requieren un String con el nombre del equipo y los resultados que regresan son enteros). 13.- Buffer Productor-Consumidor Construir un servidor para almacenar mensajes. Existen 2 tipos de clientes: Productor que envía mensajes al servidor invocando la operación send y Consumidor que descarga los mensajes del servidor invocando la operación receive. Las operaciones deben ser nobloqueantes es decir, siempre regresan inmediatamente. Las operaciones de envío siempre son exitosas y las de recepción reciben un mensaje o “null” si el buffer está vacío pero en todo caso terminan inmediatamente. Para hacer el buffer de propósito general, el tipo de mensajes será “Object” así se puede envira cualquier tipo de datos. 14.- Login Implementar un servidor que guarde en una base de datos las cuentas y passwords de un sistema. Los clientes se conectan al servidor vía RMI y le proporcionan su cuenta y passord y el servidor los compara con los registros de la base de datos, dependiendo del resultado de la comparación el servidor responde autorizando ó no el acceso. 15.- Pizza a domicilio Diseñar un sistema cliente/servidor que permita a los clientes ordenar pizzas por computadora. El cliente debe especificar el tamaño (personal, mediana, familiar,…), tipo de pizza (pan, thin,…) y los ingredientes deseados así como también su nombre, dirección y teléfono. El sistema le responde con el costo de la pizza calculado por el servidor de acuerdo a las especificaciones de la pizza. 16.- Integral Escriba un servidor que integre numéricamente funciones a la demanda de los clientes. Los clientes deben enviar la función a integrar en forma de un objeto evaluable y serializable que implemente la interfaz siguiente: public interface Evaluatable { public double evaluate(double value); } Por ejemplo: class Square implements Evaluatable, Serializable { public double evaluate(double val) { return(val * val); } } 17.- Donativos El ejemplo de los donativos consiste en una aplicación cliente-servidor de recolección de donativos. La aplicación posee un servidor que se encarga de ir recogiendo los donativos de los clientes y de ir acumulándolos. Los clientes, que interactúan con el servidor a través de RMI, van realizando sus donaciones y pueden en todo momento consultar el importe total acumulado. import java.rmi.Remote; import java.rmi.RemoteException; public interface IRecolector extends Remote { void recogerDonativo(Donativo d) throws RemoteException; Donativo obtenerTotalAcumulado() throws RemoteException; } El donativo se envía encapsulando el valor del mismo en una clase “Donativo”, cuando se pregunta por el total acumulado el servidor envía un objeto de la clase “Donativo”. 18.- Chat Modifique el programa del ejercicio “Message” de manera que todos los clientes puedan recibir e imprimir todos los mensajes. Pruebe el sistema ejecutando el servidor y varios clientes. Lo que escriba cualquiera de los clientes debe ser visto por todos los demás. El servidor debe poder tomar la iniciativa de invocar a los clientes registrados mediante “callback”. 19.- Temperatura Un sistema de monitoreo de temperatura consiste en un servidor y varios clientes. El servidor puede leer la temperatura indicada por un sensor, la temperatura puede cambiar en cualquier momento. Los clientes interesados pueden invocar remotamente al servidor para conocer la temperatura. Los clientes interesados en todos los cambios de temperatura (en variaciones de 0.5 grados centígrados) podrían consultar repetidamente la temperatura pero esto sería muy ineficiente ya que no se sabe cada cuando cambia la temperatura. Un mejor esquema consiste en que los clientes interesados se registren y el servidor les informe cada vez que cambie la temperatura. Sugerencia: Implemente el servidor como un “thread” para que simule los cambios de temperatura y notifique a los clientes registrados mediante “callback”. 20.- Estadísticas II Agregar al ejemplo Estadísticas I: 1) La posibilidad de que un cliente se conecte para actualizar las estadísticas. 2) La posibilidad de que los clientes se registren y sean avisados automáticamente cuando cambien las estadísticas