Tutorial minimalista sobre comunicacion RMI en Java

Víctor Fariña
May 30, 2006 ♥ 3 min read

Esto no pretende ser un tutorial ni mucho menos, mas bien una pequeñas prueba de concepto para la tecnologia RMI.

Recientemente me ha tocado colaborar en un proyecto con una parte cliente y una parte servidor , ambas en entornos unix y separadas fisicamente por firewalls. De modo que para comunicar las 2 partes del software estoy evaluando varias posibilidades, y para cada una de ellas tendre un ejemplo basico de funcionamiento.

En esta primera parte la evaluacion será de RMI
Para la prueba construiremos el “Hola Mundo” en version cliente/servidor
Los archivos necesarios serán:

  • Hello.java (Una interface con lo basico)
  • HelloImpl.java (El Objeto servidor en si mismo, con metodo main para poder ejecutarse)
  • HelloClient.java (El cliente java)

 

Estos 3 archivos componen la parte servidora (objetos en el lado del servidor)
Hello.java

import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Hello extends Remote {
String sayHello() throws RemoteException;
}

 

 

HelloImpl.java

        import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.server.UnicastRemoteObject;

public class HelloImpl extends UnicastRemoteObject implements Hello {

public HelloImpl() throws RemoteException {
super();
}

public String sayHello() {
return “Hola, holita…”;
}

public static void main(String args[]) {

// Create and install a security manager
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}

try {
HelloImpl obj = new HelloImpl();

// Bind this object instance to the name “HelloServer”
Naming.rebind(“//192.168.0.18/HelloServer”, obj);

System.out.println(“HelloServer bound in registry”);
} catch (Exception e) {
System.out.println(“HelloImpl err: ” + e.getMessage());
e.printStackTrace();
}
}
}

policy

 

grant {
// Allow everything for now
permission java.security.AllPermission;
};

Este es para la parte cliente
HelloClient.java

import java.rmi.Naming;
import java.rmi.RemoteException;
public class HelloClient {
static String message = “blank”;
static Hello obj = null;
public static void main(String args[]) {
try {
obj = (Hello)Naming.lookup(“//192.168.0.18” + “/HelloServer”);
message = obj.sayHello();
} catch (Exception e) {
System.out.println(“HelloApplet exception: ” + e.getMessage());
e.printStackTrace();
}
System.out.println(“MENSAJE:”+message);
}

}

Una vez que tenemos y revisamos estos archivos, compilamos y generamos los proxys para que el cliente remoto pueda acceder al objeto servidor (que simplemente devuelve un mensaje)

javac Hello.java HelloImpl.java
rmic HelloImpl

Lo cual nos genera los .class de Hello.java y HelloImpl.java . Ademas de esto, el comando rmic, genera unos proxys para copiar en el lado cliente son:
HelloImpl_Stub.class y HelloImpl_Skel.class

El archivo policy lo necesitamos en el lado del servidor para dar seguridad al acceso a nuestro objeto, el ejemplo es INSEGURO para un entorno de producción.
Ahora que tenemos toda la parte del servidor lista, ejecutamos el rmiregistry que levanta un servidor  escuchando en el puerto 1099, Este programa se encarga de recibir peticiones de Clientes que intentan localizar objetos servidores y les indica donde se encuentran fisicamente.

Una vez que tenemos levantado el rmiregisty , Levantamos nuestro objeto de lado del servidor:

java -Djava.security.policy=$HOME/Programacion/java/rmi/policy HelloImpl

haciendo referencia al archivo policy antes creado.

En el lado cliente compilamos HelloClient.java y copiamos el Stub y el Skel generados en el servidor, de modo que tengamos:

HelloClient.class
HelloImpl_Skel.class
HelloImpl_Stub.class

y ejecutamos : java HelloClient , que como resultado deberia dar :
vic@coffdeb:rmi$ java HelloClient
MENSAJE:Hola, holita…

 

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.