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.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
// 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…