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
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFJgQKJTMX-E-AoVsXQcFtTXGVXjwzJ8oTshTvSVhlg6bppqGjok31T3d5x81Ke-uznPb7Gtc8wGRTVYH0fCxRoHV57xQzjchNehPP8UGY3ZqlWOen2BSw0svXwaHrdx9vKTKUR9horms/s320/1+sermidor+rmi.bmp)
Copiar el stub y la interfaz a la carpeta del cliente y compilar cliente con javac cliente.java
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiThxYtEkW30z-8ElhsgBLMupNimSWnnLMKvigMsxebZ3zjH3-vxPSNJzZe2yUvYYgVUZfjkgdOLgdWZLtJ4c6WBTpLoTJy4EBcojZ0R0PhXB6hE8Tr12edWD0HV5arA5qJTeWWJeMDMeA/s320/2+cliente+rmi.bmp)
Arrancar el registro con start rmiregistry puerto, iniciar el servidor con java servidor, y el cliente con java cliente ip_equipo
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHu6h8TW_mjll8E5yX5pzcEw-dVhqAHhIBisjtM8P_UlCKoRixx3Sw4tlJqebBF0ZlNXTy0hILwU2x2S9qqbv23LTx4SMgop7ODc0Lr7IwcKuxl9O1C1AZYx0sR9iCTNXv3jOmIb_GC-Q/s320/3+cliente+servidor.bmp)
Prueba en dos dos equipos diferentes:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtF0fl9d67v_haX6_oSNUDyxWZpCVxuj-0G8w9Y5BzP1xnQk4lKrdOre1avxVhyphenhyphenRs4ffgoASJtWQii-qx3ADHDoPfYTD4qO8LOhmgukosmVyBd8HsY7thAnIUC1nrRomOTFxf7MKlYS9I/s200/maquina+externa.bmp)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtOzPV2TLxAPLwfXkad6VGr-Fk5MTxjhs9u1iLoPDpBlVZWbj3JGBBtONW2oqt5kB7LrFdhWqElVYRUGTDHwTtGeCd1E7U8GpMbos0fELLr7V78pGLxx0YDZ-vDFKlrlamSLYoXoKUbEk/s200/maquina+local.bmp)
-----------------------------------
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
------------------------------------
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
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFJgQKJTMX-E-AoVsXQcFtTXGVXjwzJ8oTshTvSVhlg6bppqGjok31T3d5x81Ke-uznPb7Gtc8wGRTVYH0fCxRoHV57xQzjchNehPP8UGY3ZqlWOen2BSw0svXwaHrdx9vKTKUR9horms/s320/1+sermidor+rmi.bmp)
Copiar el stub y la interfaz a la carpeta del cliente y compilar cliente con javac cliente.java
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiThxYtEkW30z-8ElhsgBLMupNimSWnnLMKvigMsxebZ3zjH3-vxPSNJzZe2yUvYYgVUZfjkgdOLgdWZLtJ4c6WBTpLoTJy4EBcojZ0R0PhXB6hE8Tr12edWD0HV5arA5qJTeWWJeMDMeA/s320/2+cliente+rmi.bmp)
Arrancar el registro con start rmiregistry puerto, iniciar el servidor con java servidor, y el cliente con java cliente ip_equipo
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHu6h8TW_mjll8E5yX5pzcEw-dVhqAHhIBisjtM8P_UlCKoRixx3Sw4tlJqebBF0ZlNXTy0hILwU2x2S9qqbv23LTx4SMgop7ODc0Lr7IwcKuxl9O1C1AZYx0sR9iCTNXv3jOmIb_GC-Q/s320/3+cliente+servidor.bmp)
Prueba en dos dos equipos diferentes:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtF0fl9d67v_haX6_oSNUDyxWZpCVxuj-0G8w9Y5BzP1xnQk4lKrdOre1avxVhyphenhyphenRs4ffgoASJtWQii-qx3ADHDoPfYTD4qO8LOhmgukosmVyBd8HsY7thAnIUC1nrRomOTFxf7MKlYS9I/s200/maquina+externa.bmp)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtOzPV2TLxAPLwfXkad6VGr-Fk5MTxjhs9u1iLoPDpBlVZWbj3JGBBtONW2oqt5kB7LrFdhWqElVYRUGTDHwTtGeCd1E7U8GpMbos0fELLr7V78pGLxx0YDZ-vDFKlrlamSLYoXoKUbEk/s200/maquina+local.bmp)
-----------------------------------
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
Comentarios
Publicar un comentario