---
title: "Tutorial minimalista sobre comunicacion RMI en Java"
url: "https://victorfarina.com/blog/tutorial_minimalista_sobre_comunicacion"
author: "Víctor Fariña"
published: "2006-05-30"
updated: "2026-10-09"
language: "es"
categories: ["tecnología"]
---

# Tutorial minimalista sobre comunicacion RMI en Java

![](https://victorfarina.com/images/rmi1.jpg){right width=80%}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**
```java
import java.rmi.Remote; import java.rmi.RemoteException; public interface Hello extends Remote { String sayHello() throws RemoteException; }
```
 

 

**HelloImpl.java**
```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**
```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**![](https://victorfarina.com/images/rmi2.jpg){right width=50%}** 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...
