Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento Ciencia de la Computación IIC2523 Sistemas Distribuidos Java RMI Ayudantía 1 Introducción • Mecanismo de Java para la invocación remota de métodos. • Funciona únicamente en ambientes distribuidos Java. • Ventajas • Recolección de basura • Paso de objetos por referencia • Paso de tipos arbitrarios Hola Mundo – Interfaz Remota package example.hello; import java.rmi.Remote; import java.rmi.RemoteException; public interface Hello extends Remote { String sayHello() throws RemoteException; } Hola Mundo – Servidor package example.hello; public static void main(String args[]) { import java.rmi.registry.Registry; import java.rmi.registry.LocateRegistry; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; try { Server obj = new Server(); Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0); public class Server implements Hello { // Bind the remote object's stub in the registry Registry registry = LocateRegistry.getRegistry(); registry.bind("Hello", stub); public Server() {} public String sayHello() { return "Hello, world!"; } System.err.println("Server ready"); } catch (Exception e) { System.err.println("Server exception: " + e.toString()); e.printStackTrace(); } } } Exportación de objetos remotos Server obj = new Server(); Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0); • Exporta el objeto para ser accesible mediante una conexión TCP • El método recibe el objeto y el puerto destino. Registro del objeto remoto Registry registry = LocateRegistry.getRegistry(); registry.bind("Hello", stub); • Define a qué dirección se accede el objeto • En este caso el objeto se accede a través de la URI //localhost/Hello Hola Mundo – Cliente package example.hello; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class Client { private Client() {} public static void main(String[] args) { String host = (args.length < 1) ? null : args[0]; try { Registry registry = LocateRegistry.getRegistry(host); Hello stub = (Hello) registry.lookup("Hello"); String response = stub.sayHello(); System.out.println("response: " + response); } catch (Exception e) { System.err.println("Client exception: " + e.toString()); e.printStackTrace(); } } } Demostración Demostración Pasos para correr el servidor. 1. Compilar las fuentes del servidor 2. Arrancar el servidor de registros de RMI (rmiregistry) 3. Crear el archivo de permisos 4. Ejecutar el servidor con los permisos Pasos para correr el cliente. 1. Compilar las fuentes del cliente 2. Ejecutar el cliente Demostración Demostración Problemas identificados • Asegurarse de correr el rmiregistry (puede ser necesario reiniciarlo). • Asegurarse de tener los puertos abiertos. • Asegurarse de cargar el archivo de policies antes de ejecutar el programa.