Notre exemple permettra à un processus client d'envoyer un bref
message texte à un processus serveur, à partir des mécanismes
de Remoting
de .NET.
Le client et le serveur utiliseront tous deux une interface commune,
Recepteur.IRecepteur, pour transiger le message en question. Un
serveur possible, ServeurAfficheurSimpliste,
implémente cette interface (en pratique, on aurait pu laisser cette
définition dans le code du serveur, plus bas).
Si vous désirez implémenter cet exemple, placez le code
à droite dans un projet de type Bibliothèque de classes.
Je présumerai plus bas que vous aurez nommé ce projet
Recepteur, donc qu'il générera le fichier
Recepteur.dll lorsqu'il sera compilé.
|
using System;
namespace Recepteur
{
public interface IRecepteur
{
void Recevoir(string message);
}
public class ServeurAfficheurSimpliste
: MarshalByRefObject, IRecepteur
{
public ServeurAfficheurSimpliste()
{
}
public void Recevoir(string message)
{
Console.WriteLine("Message reçu : {0}", message);
}
}
}
|
Le client simple proposé ici sera un programme (une application
console) qui :
- lira une ligne au clavier;
- créera puis enregistrera un canal de communication par protocole
http, connecté au port 4433 de
l'ordinateur de son homologue (ici, l'ordinateur est
localhost);
- instanciera un intermédiaire (un Proxy)
vers le serveur; et
- invoquera ses services.
|
using System;
using System.Runtime.Remoting;
// ajouter référence sur System.Runtime.Remoting.dll
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
namespace ClientRemoting
{
class Client
{
[STAThread]
static void Main(string[] args)
{
Console.Write("Message à envoyer : ");
string msg = System.Console.ReadLine();
const short PORT = 4433;
HttpChannel canal = new HttpChannel();
ChannelServices.RegisterChannel(canal, false);
// ajouter une référence sur Recepteur.dll
Recepteur.IRecepteur recepteur =
(Recepteur.IRecepteur)System.Activator.GetObject
(typeof(Recepteur.ServeurAfficheurSimpliste),
"http://localhost:" + PORT + "/Recepteur.soap");
recepteur.Recevoir(msg);
Console.WriteLine("Envoi de {0} complété", msg);
}
}
}
|
Le serveur simple proposé ici sera lui aussi un petit programme
(une application console) qui :
- créera puis enregistrera un canal de communication par protocole
http, s'appropriant le port 4433 sur
l'ordinateur courant;
- offrira une instance du petit serveur ServeurAfficheurSimpliste
sous un mode singleton
(créé une fois, utilisé par tous les clients; on
aurait aussi pu utiliser le mode Single Call, où le
serveur aurait été créé une fois par invocation);
et
- attendra qu'un usager termine le programme.
Les échanges à travers le canal sont transigés en
format SOAP,
un format respectant les règles du métalangage
XML.
|
using System;
using System.Runtime.Remoting;
// ajouter référence sur System.Runtime.Remoting.dll
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
namespace ServeurRemoting
{
class Serveur
{
[System.STAThread]
static void Main(string[] args)
{
const short PORT = 4433;
HttpChannel canal = new HttpChannel(PORT);
ChannelServices.RegisterChannel(canal, false);
// ajouter une référence sur Recepteur.dll
RemotingConfiguration.RegisterWellKnownServiceType
(typeof(Recepteur.ServeurAfficheurSimpliste), "Recepteur.soap",
WellKnownObjectMode.Singleton); // ou WellKnownObjectMode.SingleCall
Console.Write("Pressez une touche puis <enter> pour fermer le serveur");
Console.ReadLine();
}
}
}
|