RMI (Remote Method Invocation)

    Programación Distribuida y su Aplicación Bajo Internet
    Curso: 2007-2008
    Autor: Juansa Sendra

Contents

1 Definición
2 Esquema de Funcionamiento
2.1 Definición del interfaz
2.2 Definición de la implementación
2.3 Registro
2.4 Definición del servidor
2.5 Definición del cliente
3 Pasos a seguir para la ejecución
3.1 Generación de Stubs y esqueletos
3.2 Inicialización del registro
3.3 Arranque del servidor
3.4 Arranque del cliente
4 Ejemplo.- Servicio horario
[ back to top ]

1 Definición

[ back to top ]

2 Esquema de Funcionamiento

2.1 Definición del interfaz

    import java.rmi.*;

    public interface Sumador extends Remote {
        long suma(String s) throws NumeroIncorrecto, RemoteException;
    }
    public class NumeroIncorrecto extends Exception {
        private String mensaje;
        NumeroIncorrecto (String s) {mensaje=s;}
        public String getMessage() {return mensaje;}
    }

2.2 Definición de la implementación

    import java.rmi.server.*;
    import java.io.*;
    import java.util.StringTokenizer;

    public class ImplemSumador 
            extends UnicastRemoteObject 
            implements Sumador {

        public ImplemSumador() throws RemoteException {}
        public long suma(String s) 
                throws NumeroIncorrecto, RemoteException {
            long n=0;
            StringTokenizer st= new StringTokenizer(s);
            while (st.hasMoreTokens()) {
                String token=st.nextToken();
                try {n+=Long.parseLong(token);} 
                catch (NumberFormatException e) {
                    throw new NumeroIncorrecto(
                        'No puedo interpretar '+token+
                        ' como un entero');
                }
            }
            return n;
        }
    }

2.3 Registro

2.4 Definición del servidor

    import java.rmi.*;

    public class ServidorSumador {
        public static void main (String[] args) {
            System.setSecurityManager(new RMISecurityManager());
            try { 
                ImplemSumador sum= new ImplemSumador();
                Naming.rebind('SUMADOR',sum);
           System.out.println('Preparado');
            } catch (Exception e) {e.printStackTrace();}
        }
    }

2.5 Definición del cliente

import java.rmi.*;import java.rmi.registry.*;import java.net.*;import java.io.*;

    public class ClienteSumador {
        public static void main (String[] args) {
            System.setSecurityManager(new RMISecurityManager());
            try { 
                Sumador sum= (Sumador) Naming.lookup('SUMADOR');
                LineNumberReader entrada= new LineNumberReader(
                    new BufferedReader(new InputStreamReader(System.in)));

                for (;;) {
                    String linea= entrada.readLine();
                    if (linea==null || linea.length()==0) break;
                    String salida;
                    try {salida=Long.toString(sum.suma(linea));}
                    catch (NumeroIncorrecto e) {salida=e.getMessage();}
                    System.out.println(salida);
                }
            } catch (Exception e) {e.printStackTrace();}
        }
    }
[ back to top ]

3 Pasos a seguir para la ejecución

3.1 Generación de Stubs y esqueletos

    javac ImplemSumador.java
    rmic ImplemSumador

3.2 Inicialización del registro

    start rmiregistry

3.3 Arranque del servidor

    java -Djava.security.policy=politica ClienteSumador
    grant {
       permission java.security.Allpermision; // todo permitido
    };

3.4 Arranque del cliente

[ back to top ]

4 Ejemplo.- Servicio horario

    import java.rmi.*;

    interface HoraExactaI extends Remote {
        long obtenerHora() throws RemoteException;
    }
    import java.rmi.*;
    import java.rmi.server.*;
    import java.rmi.registry.*;
    import java.net.*;

    public class HoraExacta 
        extends UnicastRemoteObject 
        implements HoraExactaI {

        // Implementación de la interface:
        public long obtenerHora() throws RemoteException {
            return System.currentTimeMillis();
        }

        // Implementación del constructor para lanzar RemoteException:
        public HoraExacta() throws RemoteException {
            super();
        }

        // Registro del servicio:
        public static void main(String[] args) {
            System.setSecurityManager(new RMISecurityManager());
            try {
                HoraExacta he = new HoraExacta();
                Naming.bind("//canyella:2005/HoraExacta", he);
                System.out.println("Preparado...");
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
    rmic master.rmi.HoraPerfecta
    import java.rmi.*;
    import java.rmi.registry.*;

    public class MuestraHoraExacta {
        public static void main(String[] args) {
            System.setSecurityManager(new RMISecurityManager());
            try {
                HoraExactaI t =
                    (HoraExactaI)Naming.lookup("//canyella:2005/HoraExacta");
                for(int i = 0; i < 10; i++)
                    System.out.println("Hora Exacta = " +t.obtenerHora());
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
[ back to top ]