domingo, 28 de noviembre de 2010

Java RMI - Ejecucion de codigo remoto

Hago este post, porque me cance de ver tutoriales sobre este tema muy poco claros o que no funcionan. Para entender el codigo se necesita conocimiento basico sobre programacion.
------------------------------------
RMI o Invocación de metodo remoto es un mecanismo de Java, que permite la ejecucion de codigo desde un programa cliente a uno servidor, ubicado en otro equipo en la red.

Servidor:
-El servidor cuenta con la clase "InterfazRemota" que hereda de java.RMI.Remote con los métodos que luego redefinirá el "ObjetoRemoto".

public interface InterfazRemota extends java.rmi.Remote{
public String Imprimir(String mensaje) throws java.rmi.RemoteException;
}


-El "ObjetoRemoto" va a implementar la clase InterfazRemota. En el constructor de la clase se utiliza el método Naming.rebind para vincular la dirección y el nombre del objeto remoto al registro rmi. Y debajo se redefiniran los metodos ha utilizar. De esta clase se obtiene el Stub.

import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class ObjetoRemoto extends UnicastRemoteObject implements InterfazRemota{
public ObjetoRemoto(String nombre) throws java.rmi.RemoteException{
super();
try{
Naming.rebind(nombre, this);
}
catch(Exception e){

System.out.println("Excepcion: "+e.getMessage());
e.printStackTrace();
}
}
public String Imprimir(String mensaje) throws java.rmi.RemoteException{
System.out.println("Mensaje Recibido: "+ mensaje);
return mensaje;
}
}


-La clase "Servidor" tendrá el main, solo creará un objeto de la clase ObjetoRemoto, y pasará por parámetro el puerto y el nombre.

import java.rmi.*;
import java.rmi.server.*;
public class Servidor{
public static void main (String args[]){
try{
ObjetoRemoto obj = new ObjetoRemoto("//:80/pruebaRMI");
System.out.println("Servidor de ObjetoRemoto listo.");
}
catch(Exception e){
System.out.println("Excepcion: "+e.getMessage());
e.printStackTrace();
}
}
}

Cliente:
-El cliente debe tener la InterfazRemota y el Stub, utilizados en el servidor. La clase cliente, crea un objeto de InterfazRemota y buscará el objeto remoto mediante Naming.lookup, la sentencia args[0] permite obtener la dirección ip que se le pasara por parámetros, así poder ejecutar el método remoto.

import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;
public class Cliente {
public static void main(String args[]){
try{
String mensajeRecibido;
String mensajeEnviado = "mensaje de prueba";
InterfazRemota obj = (InterfazRemota)Naming.lookup("rmi://"+ args[0] + ":80/pruebaRMI");
System.out.print("Msj>");
mensajeRecibido = obj.Imprimir(mensajeEnviado);
System.out.println(mensajeRecibido);
System.out.print("Msj>");
}
catch(Exception e){
System.err.println("Excepcion de Sistema:"+e);
}
System.exit(0);
}
}


------------------------------------
Compilar el Servidor mediante javac *.java y generar el stub con rmic objetoremoto

Copiar el stub y la interfaz a la carpeta del cliente y compilar cliente con javac cliente.java

Arrancar el registro con start rmiregistry puerto, iniciar el servidor con java servidor, y el cliente con java cliente ip_equipo

Prueba en dos dos equipos diferentes:

-----------------------------------
En el ejemplo solo se imprime un mensaje en el equipo con el servidor, pero imagínense el potencial. Generar un jar con una ventana corriendo en segundo plano, inmune a un antivirus, utilizar métodos como toolkits para obtener información del equipo o ejecutar código arbitrario mediante exec, etc.
En fin, me despido hasta la próxima entrada. Saludos

No hay comentarios:

Publicar un comentario