Contenidos
El paquete RMI (Remote Method Invocation) permite manejar objetos (y sus respectivos métodos) de manera remota y transparente para el usuario.
El elemento fundamental es la interfaz remota que sirve para identificar interfaces cuyos métodos pueden invocarse desde una máquina virtual no local.
Cualquier objeto que sea un objeto remoto debe implementar directa o indirectamente esta interfaz. Las clases de implementación pueden implementar cualquier número de interfaces remotas y pueden extender otras clases de implementación remota. RMI proporciona algunas clases de conveniencia que las implementaciones de objetos remotos pueden extender y que facilitan la creación de objetos remotos.
Interfaz remota
Interfaz que contiene los métodos que se ejecutarán de forma remota.
1 2 3 4 5 6 |
import java.rmi.Remote; import java.rmi.RemoteException; public interface Conversor extends Remote{ public int binario(int a) throws RemoteException; } |
Conversor
Definición de los métodos de la interfaz remota
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import java.rmi.*; import java.rmi.server.*; //Implementamos la interfaz remota. public class ConversorImpl extends UnicastRemoteObject implements Conversor { public ConversorImpl() throws RemoteException { super(); } public int binario(int a) throws RemoteException { return Integer.parseInt(Integer.toBinaryString(a)); } } |
Servidor
Servidor que crea el objeto remoto
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import java.rmi.registry.Registry; import java.rmi.registry.LocateRegistry; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class ConversorServerRmi { public static void main(String args[]) throws RemoteException{ try { // Creamos el registro Registry registry = LocateRegistry.createRegistry(5556); // Instanciamos Conversor obj = new ConversorImpl(); // Exportar el objeto al stub registry.rebind("Conversor", obj); System.err.println("Servidor funcionando"); } catch (Exception e) { System.err.println("Error de Servidor: " + e.toString()); e.printStackTrace(); } } } |
Cliente
Cliente que utiliza el objeto remoto
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import java.io.BufferedReader; import java.io.InputStreamReader; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class ConversorClienteRmi { public static void main(String[] args) { try { int numero; String opcion=""; int resultado; // Obtenemos el registro conectando al puerto Registry registry = LocateRegistry.getRegistry("localhost",5556); // Buscamos en el registro el objeto remoto Conversor c = (Conversor) registry.lookup("Conversor"); // Pedimos numero al usuario BufferedReader in = new BufferedReader(new InputStreamReader(System.in,"UTF-8")); System.out.println("Escribe la cantidad en decimal: "); numero = Integer.parseInt(in.readLine()); resultado=c.binario(numero); System.out.println( "En binario: "+resultado ); } catch (Exception e) { System.err.println("Client exception: " + e.toString()); e.printStackTrace(); } } } |