Desarrollo con Mono (.Net) en varios lenguajes – parte 1

Posted on the marzo 5th, 2008 under Código Experimental,GNU/Linux,Investigación,Probando herramientas,Programación Orientada a Objetos,Software Libre by Nacho

Para la cátedra de Administración de Recursos el año pasado, debíamos realizar un trabajo de investigación y desarrollo, en el cuál se mostraran nuevas tecnologías que permitieran integrar sistemas. Buscando cumplir con el objetivo asignado por la cátedra y a la vez investigar en algo que aún no hubiéramos profundizado fue lo que nos llevó a la plataforma Mono.

Milton ya estaba desarrollando un sistema utilizando esta plataforma, César ya había programado con .Net (C# y VB.Net) para un TP anterior y yo algo de Web Services ya había utilizado (consumido con PHP, pero nunca creado) y además estaba usando C# para algunas cosas.

Sin embargo queríamos probar la madurez del proyecto Mono, utilizar las últimas versiones de MonoDevelop como IDE y las librerías y compiladores que pudieramos. Se nos ocurrió implementar un sistema de mensajería instantánea al estilo Gaim, obviamente que con la única posibilidad de enviar mensajes de texto y ver la lista de usuarios conectados. Pero, a medida que avanzabamos, le ibamos agregando cosas.

Para probar la independencia del lenguaje en la plataforma .Net utilizamos:

C#, Boo, Java (usando IKVM.NET para compilar a CIL) y VB.NET

La arquitectura

Planteamos una arquitectura cliente – servidor, para la comunicación entre los clientes desarrollados para correr sobre la plataforma Mono (o .Net). Para los clientes que utilizarían el Web Service, la arquitectura planteada difiere en que cada una de las acciones son expuestas en formas de servicios (conectarse, enviar mensajes, recibir mensajes, ver lista de contactos, desconectarse) los cuales son ejecutados por «clientes virtuales», que representan al cliente Web en su ausencia (debido a cómo funciona un cliente web, que no conserva un estado o sincronismo con el servidor y la naturaleza pull del protocolo HTTP). Si bien evaluamos utilizar alguna técnica PUSH desde el servidor al cliente, escaba de nuestro objetivo de estudio.

El diagrama que está debajo muestra la arquitectura propuesta para resolver el problema de interoperabilidad y poder hacer una prueba de integración, no sólo de clientes que corran sobre la plataforma .Net, sino con clientes que corrieran en otra plataforma (como PHP) utilizando el WS.

Arquitectura

El ServidorIM es el servidor que realiza la comunicación entre los clientes, y les informa de los eventos ocurridos. El Servidor de Clientes, provee una interfaz para crear clientes que representen a un Cliente web (el que trabaja en un modo de poleo como fue explicado) para no perder los eventos enviados por el servidor. Estos clientes van capturando los eventos y modificando su estado interno para cuando los cliente web soliciten el estado, sea la sumatoria de esos eventos ocurridos.

En el diagrama que está debajo, se puede observar como fue implementada esa arquitectura, utilizando Remoting. Heredando de MarshalByRefObject, obteniamos clases que podían generar instancias únicas tanto del servidor como de los clientes. El Servidor mediante un stub de ClienteRemoto podía informar de los eventos a cada Cliente, y cada Cliente podía enviar un mensaje al objeto remoto ControladorConexiones mediante un stub creado por Remoting.

Diagrama Clases Remoting

Las clases y su implementación (mezclando librerías en distintos lenguajes)

En el siguiente diagrama, mostramos los paquetes en los cuales trabajamos por separado, primero fijando las interfases necesarias para poder desarrollar en forma conjunta. Cada paquete está programado en un lenguaje distinto, que tuviera un compilador o traductor a CIL. Utilizamos C#, Boo, Java (usando primero javac de Sun y luego IKVM.NET), y VB.NET. Con otros lenguajes también hicimos pruebas, pero no tuvimos suficiente tiempo como para incluirlos o no estaban lo suficientemente maduros.

Diagrama Clases Completo

Este borrador lo teníamos escrito hace rato, así que decidí publicarlo. La segunda parte contará algunos problemas que tuvimos y cómo los resolvimos (por ejemplo las aplicaciones «sensibles»). También algunas capturas del programa funcionando (web y el cliente GTK#).

Hasta la próxima! 🙂

3 Responses to 'Desarrollo con Mono (.Net) en varios lenguajes – parte 1'

  1. marzo 5, 2008 a las 1:56 pm
    Milton Pividori
  2. marzo 6, 2008 a las 8:24 am
    Nacho

Leave a Reply




XHTML::
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>