En el desarrollo de software, la idea de separar la lógica del negocio de la interfaz gráfica de usuario (GUI) fue posible gracias, entre otras cosas, al concepto de middleware (software que se sitúa entre un sistema operativo y las aplicaciones que se ejecutan en él) y la teoría de los sistemas distribuidos.
Dentro de la programación orientada a objetos (POO) encontramos un ejemplo representativo de middleware para objetos distribuidos: RMI (Remote Method Invocation). RMI, así como otras tecnologías middleware, tienen como antecedente a RPC (Remote Procedure Call), que se usaba ampliamente dentro del paradigma procedimental, y introdujo conceptos muy importantes como stubs, skeletons e IDL. La principal ventaja (y desventaja) de RMI es que es una tecnología propia en Java, por lo que solamente los objetos remotos que se programen aquí, estarán disponibles para aplicaciones programadas con Java.
Un error común cuando hablamos de RMI y otras tecnologías distribuidas es usar como sinónimos los conceptos de interfaz e interfaz gráfica de usuario. La primera acepción es un concepto propio de la POO, haciendo referencia a aquella entidad que solamente contiene métodos abstractos (métodos que no están implementados), siendo las demás entidades que se unan a ella las que implementarán a dichos métodos; por otro lado, las GUIs son las representaciones gráficas para nuestras aplicaciones (ventanas con botones y cuadros de texto, por ejemplo). En este post, cuando hablemos de las primeras lo haremos con el término "interfaz" y las segundas como GUIs.
Loa 4 pasos básicos para el desarrollo de aplicaciones RMI son:
- Definir la interfaz remota
- Implementar la interfaz remota
- Implementar la clase servidora
- Implementar la clase cliente
- Ejecutar 3 y 4, en ese orden
Usaremos estos puntos sobre un ejemplo clásico en RMI: una calculadora simple en modo comando. En una primera propuesta solo se programarán dos funciones para
que tengas la oportunidad de realizar las otras dos restantes
(multiplicar y dividir) a manera de ejercicio. Los códigos que se muestran a continuación están disponibles
al final del post.
1. Definiendo a la interfaz remota
La interfaz deberá heredar de Remote y los métodos lanzarán la excepción RemoteException. Recuerde que la implementación de los métodos no se hace aquí, dado que estamos en el contexto de una interfaz.
2. Implementando a la interfaz remota
Crearemos una clase (CCalculadora) que implemente a los métodos abstractos de ICalculadora. Es necesario hacer visible al constructor por default lanzando a RemoteException.
3. Implementando a la clase servidora
Crearemos otra clase (CServidor), la cual registrará y expondrá al objeto remoto (líneas 8 y 9).
Crearemos una clase (CCliente), que localizará al objeto remoto y obtendrá una referencia para poder acceder a sus métodos (líneas 8 y 9).
5. Ejecutando la clase servidor y la clase cliente
Ejecutaremos primero a CServidor y en segundo momento a CCliente.
Mientras no se detenga al proceso servidor, se puede seguir ejecutando la instancia cliente tantas veces se requiera, modificando los parámetros de sumar y restar de las líneas 12 y 13.
Como se ha podido ver, la estructuración de un proyecto RMI en estos cinco pasos, simplifica su desarrollo; claro está, lo ideal sería que aisláramos la parte servidor del cliente, para que el objeto se encontrara realmente de forma remota. El código de este proyecto lo puedes bajar aquí 📄
Sugerencia de ejercicio. Enriquecer la calculadora con las dos operaciones básicas restantes: multiplicar y dividir. Para la división, tomar en cuenta los valores decimales en el resultado; por ejemplo, para el caso de 8/7 deberá regresar 1.142857.
Puedes hacer uso del texto y/o código aquí proporcionados en tus trabajos escolares o profesionales, siempre y cuando incluyas la siguiente referencia APA:
Castillo, F. (2018). RMI: un ejemplo práctico. Blog de Francisco Castillo. Disponible en: https://fcoantoniocastillo.blogspot.com/ [Visitado el DD de <nombre-mes> de 20XX].
Comentarios
Publicar un comentario