style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Ejemplo bastante simple de RMI

 

He aquí un ejemplo bastante simple de RMI (Servidor y Cliente).

Primeramente escribimos la interfaz remota con los métodos requeridos. Por ejemplo, un método para saludar:

package com.company.app;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface TestRemote extends Remote {

    String sayHello(String name) throws RemoteException;

}

A continuación, implementamos esta interfaz en una clase. Para mayor simplicidad, he utilizado una clase anónima. Y ya que estamos en esto, escribimos también el programa Servidor, el cual registrará la instancia generada a partir de la clase anónima:

package com.company.app;

import java.rmi.AlreadyBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class Server {

    public static void main(String[] args) throws RemoteException, AlreadyBoundException {

        Remote stub = UnicastRemoteObject.exportObject(new TestRemote() {
            @Override
            public String sayHello(String name) throws RemoteException {
                return "Hello, " + name;
            }
        }, 0);

        Registry registry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
        registry.bind("Test", stub);

    }

}

Por último, escribimos el cliente, el cual accederá al objeto remoto en el servidor.

package com.company.app;

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Client {

    public static void main(String[] args) throws RemoteException, NotBoundException {
        Registry registry = LocateRegistry.getRegistry();
        TestRemote testRemote = (TestRemote) registry.lookup("Test");
        System.out.println(testRemote.sayHello("JavaMexico"));
    }

}


Una vez que corremos el servidor, este se quedará esperando por peticiones. Y por cada vez que corramos el cliente, éste imprimirá «Hello, JavaMexico».


Para saber más:

~~~

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

host to host

En mi chamba tenemos dos sistemas que se comunican por RMI. No es lo más eficiente, principalmente porque cada invocación se va por una conexión separada, y hay bastantes invocaciones de un sistema al otro.

Una optimización que hicimos para mejorar tiempos de respuesta, usar menos ancho de banda y sobre todo aligerar recursos (hilos y sockets, principalmente) en la aplicación que recibe las invocaciones, fue ya no usar RMI directamente, sino abrir un socket y manejar un protocolo asíncrono, serializando los objetos que normalmente se pasan por la invocación. Inicialmente pensaba cambiar esto por protocol buffers o algo similar, pero la verdad es que la mejora en el desempeño simplemente usando una sola conexión asíncrona en vez de conexión por invocación fue tan notable que no es necesario al menos por ahora hacer esa segunda mejora, con serializar los objetos directamente (como hace RMI) es suficiente.

Imagen de CharlieCorner

Entonces, ¿básicamente lo que

Entonces, ¿básicamente lo que hicieron fue no usar RMI e implementar algo más simple a manita para poder meter un socket asíncrono?

Imagen de ezamudio

Más simple? no

Pues no es más simple que RMI, porque tienes que manejar la conexión en tu código, pero sí fue bastante más eficiente: en vez de que cada petición via RMI se fuera por su propia conexión, abriendo N sockets entre ambos procesos, se maneja una sola conexión por donde pasan todas las peticiones y respuestas.

Imagen de Jose Manuel

Entonces @ezamudio el sistema

Entonces @ezamudio el sistema del que habla es un sistema clientes/servidor?, utilizando RMI claro. Ya que como menciona que RMI hace una nueva conexión por petición. Como hizo para controlar la comunicación por un solo canal?
Si hago preguntas muy simples favor de mencionar y si es posible alguna recomendación de aprendizaje. Gracias y saludos.

Imagen de ezamudio

pronto

Creo que amerita un post propio, más que ponerlo aquí como respuesta.

Así que aquí está:

http://www.javamexico.org/blogs/ezamudio/comunicacion_asincrona_entre_pr...

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">