1. En el directorio servidor1 tenemos un servidor RMI ServidorPrimos que está continuamente calculando números primos. Implementa la interfaz remota InterfazServidorNumeros:
public interface InterfazServidorNumeros extends java.rmi.Remote { public int ultimoNumero() throws java.rmi.RemoteException; }
donde el método ultimoNumero() devuelve el último número encontrado. El interfaz remoto ya está compilado y metido en el fichero JAR interfaz.jar.
En el directorio cliente1 tenemos el esqueleto de un cliente ClienteNumeros que queremos que se conecte a dicho servidor. El directorio también tiene el fichero interfaz.jar con la interfaz remota, y el fichero java.policy con la política de seguridad.Se pide:
Completar el código del cliente para que obtenga un objeto remoto y llame a su método ultimoNumero(). Para ello, seguir los pasos:
- Instalar un gestor de seguridad:
if (System.getSecurityManager() == null) System.setSecurityManager( new java.rmi.RMISecurityManager());
- Obtener un objeto remoto (con Naming.lookup()). El nombre con que se ha registrado (ver el código del servidor) es ServidorNumeros:
//direccion_IP:puerto/ServidorNumerosLa dirección IP y el puerto es recomendable pasarlos como parámetro al main() para que puedan modificarse sin problema. Podéis ver el código del cliente visto en teoría para ayudaros.
- Llamar al método ultimoNumero() de dicho objeto y sacar por pantalla lo que devuelve
Para probar el programa:
compilar ejecutar 1200 (Windows). ./compilar.sh . ./ejecutar.sh 1200 (Linux)
set CLASSPATH=.\interfaz.jar;. (Windows) export CLASSPATH=./interfaz.jar:. (Linux)
javac ClienteNumeros.java
- Copiar el fichero Stub del servidor en la carpeta del cliente.
- Ejecutar el cliente pasándole los parámetros necesarios (fichero de política de seguridad, IP y puerto, como se hace en el ejemplo visto en teoría).
Podéis utilizar los scripts para compilar y ejecutar el cliente visto en teoría, cambiando lo que sea necesario. Ejecutando el cliente varias veces podréis comprobar cómo el servidor va descubriendo nuevos números.
2. En el directorio servidor2 queremos tener otro servidor RMI ServidorVeces que implemente la misma interfaz remota InterfazServidorNumeros vista antes, pero que la llamada al método ultimoNumero() en este caso devuelva el número de veces que se ha solicitado ese método (en lugar del último primo calculado). Se tiene la interfaz remota en el fichero interfaz.jar de la carpeta del servidor.
Se pide:
a) Implementar el servidor (completar el esqueleto que se da) para que realice la función indicada. Para ello podéis valeros del servidor anterior como ayuda, siguiendo los pasos:
- Rellenar el método ultimoNumero() para que devuelva el número de veces que se ha pedido el mismo. Podéis crear los campos en la clase y variables auxiliares que necesitéis.
- Rellenar el método main() para que:
- Instale un gestor de seguridad.
- Cree un objeto remoto
- Lo publique (con Naming.rebind())
- Compilar y ejecutar el servidor. Podéis utilizar los scripts de compilar y ejecutar del servidor1, adaptándolos a este nuevo servidor.
b) ¿Qué cambios habría que hacer en el cliente ClienteNumeros del primer ejercicio para conectar con este otro servidor? Indicad en el fichero respuestas.txt los cambios que se realizarían.
3. Supongamos que tenemos que crear un cliente RMI que se conecta a una máquina remota para acceder a un objeto remoto llamado MiObjetoDesconocido, cuyo código fuente desconocemos. Se nos proporciona en un fichero JAR llamado compartido.jar la interfaz que implementa el servidor (llamada MiInterfazDesconocida), y una clase Serializable que utiliza (llamada Datos).
Se pide:
Completar en la carpeta cliente3 el cliente Ej3 que acceda a un objeto remoto de este tipo, valiéndonos únicamente del fichero compartido.jar con la interfaz remota y la clase serializable.
Podéis valeros del cliente visto en teoría o el del primer ejercicio como ayuda.
Los pasos que se piden en el cliente son:
- Instalar un gestor de seguridad:
- Obtener un objeto remoto (con Naming.lookup()):
MiInterfazDesconocida mid = ... // Codigo para acceder al objeto remotoEl nombre con que se ha publicado en el registro RMI es "Desconocido", es decir:
//direccion_IP:puerto/Desconocido
- Llamar al método datos() del objeto remoto y obtener un objeto Datos:
Datos d = mid.datos();
- Llamar al método cadena() del objeto Datos obtenido y ver lo que saca por pantalla:
System.out.println (d.cadena());
- En clase se dejará un servidor funcionando con el objeto remoto en una máquina remota. Compilad y conectad el cliente a dicha máquina e indicad en el fichero respuestas.txt lo que devuelve al llamar a cadena() en el cliente.
Para entregar: Debéis entregar un ZIP e7.zip con: