July 6th, 2007Programación con C# y .NET Remoting/Mono Remoting [5/7]
Indice general de los manuales
- Introducción, instalación en Ubuntu y creación de una calculadora.
- Modos de compartición de objetos. Creando nuestra primera calculadora distribuida.
- Modos de compartición de objetos: Singlecall.
- Modos de compartición de objetos: Singleton.
- Modos de compartición de objetos: CAO. « [Leyendo]
- Canales: TCP y HTTP. Configuración en archivo XML.
- Uso de interfaces para separar el código entre cliente y servidor.
CAO
La última de las formas de compartir los objetos desde el servidor es CAO: Client Activated Object. De esta forma, cada cliente que acceda al servidor, podrá crear un objeto en el y usarlo de forma independiente. En nuestro ejemplo, cada cliente tendrá su propia calculadora.

Como vemos, cada cliente tiene su propia calculadora, y cada calculadora guarda su estado.
Aunque el nuevo código del servidor es muy parecido a los anteriores, pongo el cuerpo de Main entero:
- // Archivo: Servidor.cs
- // Descripcion: programa servidor que comparte
- // la clase Calculadora remotamente.
- // Biblioteca estandar y remoting
- using System;
- using System.Runtime.Remoting;
- // Bibliotecas para usar un canal HTTP
- using System.Runtime.Remoting.Channels;
- using System.Runtime.Remoting.Channels.Http;
- using Calculo;
- public class Servidor
- {
- // arg[0] representa el puerto del servidor
- public static void Main (string[] args)
- {
- // Creamos un nuevo objeto para el canal HTTP
- HttpChannel chnl = new HttpChannel(int.Parse(args[0]));
- // Le decimos a la máquina que nos reserve ese canal
- ChannelServices.RegisterChannel(chnl);
-
- // Opciones para la comparticion de la clase
- RemotingConfiguration.ApplicationName =
- “ServidorDeCalculadoras”;
- RemotingConfiguration.RegisterActivatedServiceType(
- typeof(Calculo.Calculadora));
- // Mensajes de espera en la pantalla
- Console.WriteLine(“Atendiendo las peticiones…”);
- Console.WriteLine(“Pulse Enter para salir…”);
- Console.ReadLine();
- }
- }
La configuración del servidor la hemos dividido en dos partes, le hemos adjudicado un nombre que será el del servidor, no el de una calculadora; y después hemos compartido la calculadora.
Vamos a modificar el cliente por completo, para que no tengamos que hacer dos clientes diferentes para ver el funcionamiento de esta forma de compartir.
- // Archivo: Cliente.cs
- // Version: 2.0
- // Descripcion: cliente que usara la clase remota Calculadora
- // Biblioteca estandar y remoting
- using System;
- using System.Runtime.Remoting;
- // Bibliotecas para usar un canal HTTP
- using System.Runtime.Remoting.Channels;
- using System.Runtime.Remoting.Channels.Http;
- using Calculo;
- public class Cliente
- {
- // arg[0] representa el host del servidor
- // arg[1] representa el puerto del servidor
- // arg[2] representa el numero que guardamos en LaBase
- public static void Main (string[] args)
- {
- // Creamos un nuevo objeto para el canal HTTP
- HttpChannel chnl = new HttpChannel();
- // Le decimos a la máquina que nos reserve ese canal
- ChannelServices.RegisterChannel(chnl);
- // Opciones para la utilizacion remota de la clase
- RemotingConfiguration.RegisterActivatedClientType(
- typeof(Calculo.Calculadora),
- “http://” + args[0] + “:” + args[1]);
- // Creamos un objeto
- Calculadora calc = new Calculadora();
- // Practicamos
- calc.LaBase = int.Parse(args[2]);
- Console.WriteLine(“Cambiado a: “ + cacl.LaBase);
- Console.WriteLine(“Pulse Enter para ver el estado…”);
- Console.ReadLine();
- Console.WriteLine(“Hemos cambiado la base a “ + calc.LaBase);
- }
- }
Podemos ver varios cambios en este nuevo cliente:
- A diferencia de los anteriores, solo necesitamos saber el host y el puerto del servidor, no nos hace falta saber el nombre con el que el servidor se ha autodenominado.
- Hemos añadido un nuevo argumento al ejecutar el programa, que será el número que queremos adjudicar a LaBase, y así poder hacer varias pruebas para cambiar el estado desde el cliente sin tener que crear dos.
- Para comprobar que cada cliente tiene su propia calculadora, hemos interrumpido el programa a la mitad (pulsando Enter) para cambiar el estado desde dos clientes diferentes que se ejecutan a la misma vez y comprobar después que cada uno tiene una calculadora con su propio estado.
Ahora solo nos queda compilar los archivos:
mcs -target:library Calculo.cs
mcs -r:Calculo.dll -r:System.Runtime.Remoting.dll Servidor.cs
mcs -r:Calculo.dll -r:System.Runtime.Remoting.dll Cliente.cs
Ejecutaremos los archivos en diferentes consolas:
Ejecutar el servidor:
./Servidor.exe 9999
El cliente 1:
./Cliente.exe localhost 9999 5
Y su resultado:
Cambiado a: 5
Pulse Enter para ver el estado…
Y el cliente 2:
./Cliente2.exe localhost 9999 8
Y su resultado:
Cambiado a: 8
Pulse Enter para ver el estado…
Una vez que tenemos los dos clientes cargados, pulsamos Enter en cada uno de ellos y vemos que conservan su estado:
El Cliente 1:
Hemos cambiado la base a 5
El Cliente 2:
Hemos cambiado la base a 8
En el servidor solo veremos como cada cliente crea un nuevo objeto.
Atenciando las peticiones…
Pulse Enter para salir…
Contructor.
Constructor.
Ya que cada cliente puede crearse su propia calculadora, podríamos replantearnos dejar que cada objeto “muera” pasado un tiempo (el tiempo de vida que vimos en el capítulo anterior) o controlar todas las instancias que se hacen desde los servidores con un atributo estático que vaya aumentando por cada instancia. Deberíamos pensar esto ya que puede que alguien malintencionado haga miles de clientes que llamen a nuestro servidor, creando miles de instancias y bloqueando el servidor.
Aunque ya está escrita la parte más importante del manual, en los siguientes capítulos veremos trucos y formas de usar la teoría que hemos dado hasta ahora.
El código fuente de uno de los comentarios expuestos abajo, se encuentra aquí.
Indice general de los manuales
- Introducción, instalación en Ubuntu y creación de una calculadora.
- Modos de compartición de objetos. Creando nuestra primera calculadora distribuida.
- Modos de compartición de objetos: Singlecall.
- Modos de compartición de objetos: Singleton.
- Modos de compartición de objetos: CAO. « [Leyendo]
- Canales: TCP y HTTP. Configuración en archivo XML.
- Uso de interfaces para separar el código entre cliente y servidor.

