Overblog Suivre ce blog
Editer l'article Administration Créer mon blog

Présentation

  • : Romagny13 - Du .NET,du pur .NET
  • Romagny13 - Du .NET,du pur .NET
  • : Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
  • Contact

Recherche

Articles Récents

19 mars 2007 1 19 /03 /mars /2007 21:20
Remoting
I – Côté Service
1 - Objet MBR
-          Classe hérite de MarshalByRefObject [System.MarshalByRefObject]
-          Contient toutes les méthodes auquel le client pourra faire appel
-          > WKO : activé coté serveur (ds exemple ici)
>CAO : activé coté client (voir plus bas)
public class NomClasse : MarshalByRefObject
    {
        // constructeur
        public NomClasse()
        { }
      
       // Méthodes
        public < Type > NomMethode1 (< paramétres >)
        {     
            Return <resultat>;
        }
        public < Type > NomMethode2 (< paramétres >)
        {     
            Return <resultat>;
        }
 
        // etc.
 
    }
 
2 – Hote
-          1 - création d'un canal avec le n° de port
-          2 - enregistre le canal (RegisterChannel > méthode statique)
-          3 - association (type,objetUri,mode)
-          4 – durée de vie de l’objet MBR > System.Runtime.Remoting.WellKnownObjectMode.SingleCall : utilisé une seule fois (1 seul appel de méthode puis destruction)
>System.Runtime.Remoting.WellKnownObjectMode.Singleton : bail de 5 minutes puis de 2 min a chaque appel suivant, ce bail est renouvelé a chaque nouvel appel de méthode, l’objet est detruit si aucun appel de methode n’a lieu avant la fin du bail (géré uniquement coté serveur toutefois il est possible du cote client de prolonger ce « bail » par un objet System.Runtime.Remoting.Lifetime.ILease et la méthode Renew pour laquelle on indique alors la durée souhaitée)
Ex :
// augmenter cote client la durée de vie de l'objet MBR (uniquement dans le cas WKO + SINGLETON)
                System.Runtime.Remoting.Lifetime.ILease oILease = (System.Runtime.Remoting.Lifetime.ILease)NET2CsRemoting.Server.Surface;
                oILease.Renew(TimeSpan.FromMinutes(10));
 
 
static void Main(string[] args)
        {
            System.Runtime.Remoting.Channels.Tcp.TcpServerChannel oTcpChannel;
 
            // 1 - création d'un canal avec le n° de port
            oTcpChannel = new System.Runtime.Remoting.Channels.Tcp.TcpServerChannel(<N° port>);
            // 2 - enregistre le canal (RegisterChannel > méthode statique)
            System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(oTcpChannel, false);
            // 3 - association (type,objetUri,mode)
            System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownServiceType(typeof(<Type>), "RemoteSurface", System.Runtime.Remoting.WellKnownObjectMode.Singleton);
 
        }
 
II - Côté Client
>le client doit reference l’assembly du service
>Un proxy est créé dynamiquement (donc invisible) qui permet au client de manipuler une « image » de l’objet distant(objet proxy>appel à un objet formattant le message > appel à un objet chargé de transmettre le message par lme réseau puis sens inverse de la chaine cote service )
> formattage des messages : flux binaire pour canal TCP -  protocole SOAP avec canal HTTP
1 – Ouvrir le canal de communication (URI) sur l’objet visé du service
2 – Dialogue (requete / reponse cad appel de méthodes et retour du résultat) [System.Activator]
oType = (<Type>)Activator.GetObject(typeof(<Type>), "URI");
               
Result = oType.MethodeType();
               
 
 
Il est possible de configurer le remoting soit par programmation, soit dans un fichier de configuration
A noter également côté client
Exemple complet : le service permet de calculer la surface d’un carré
Côté service (console application)
1 - MBR
using System;
using System.Collections.Generic;
using System.Text;
 
namespace NET2CsRemoting.Server
{
    ///<summary>
    /// 1 - Objet MBR (objet distant)
    ///</summary>
    public class Surface : System.MarshalByRefObject
    {
        public Surface()
        {
        }
      
        public Single CalculateSquareSurface(Single Rayon)
        {
            Console.WriteLine("Execution CalculateSquareSurface");
 
            Single Result;
            Result = (Single)(Rayon * Rayon);
 
            return Result;
        }
       
    }
}
 
2 – Hote
using System;
using System.Collections.Generic;
using System.Text;
 
namespace NET2CsRemoting.Server
{
    class Program
    {
        ///<summary>
        /// 2 - l'hote - permet de rendre accessible l'objet distant MBR par un canal de communication + associer une URI a cet objet
        ///</summary>
        ///<param name="args"></param>
        static void Main(string[] args)
        {
            System.Runtime.Remoting.Channels.Tcp.TcpServerChannel oTcpChannel;
 
            // 1 - création d'un canal avec le n° de port
            oTcpChannel = new System.Runtime.Remoting.Channels.Tcp.TcpServerChannel(60001);
            // 2 - enregistre le canal (RegisterChannel > méthode statique)
            System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(oTcpChannel, false);
           
            // --- A - WKO ----
            // 3 - association (type,objetUri,mode)
//System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownServiceType(typeof(Surface), "RemoteSurface", System.Runtime.Remoting.WellKnownObjectMode.Singleton);
            // ou
            // System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownServiceType(typeof(Surface), "RemoteSurface", System.Runtime.Remoting.WellKnownObjectMode.SingleCall);
           
            // --- B - CAO ------ activé cote client          System.Runtime.Remoting.RemotingConfiguration.RegisterActivatedServiceType(typeof(Surface));
 
            // Fin du service
            Console.WriteLine("Appuyer sur une touche pour stopper le serveur");
            Console.ReadLine();
        }
    }
}
 
 
Côté client
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
 
namespace NET2CsRemoting.UI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            this.CallCalcultateSquareSurface();
        }
 
        // Methods
        public void CallCalcultateSquareSurface()
        {
            NET2CsRemoting.Server.Surface oSurface;
            Single Result;
 
            try
            {
                // -- A - WKO
                // 1 ouverture du canal de communication sur l'uri (remarque l'uri contient bien l'objetUri definie ds l'hote coté service)
                //oSurface = (NET2CsRemoting.Server.Surface)Activator.GetObject(typeof(NET2CsRemoting.Server.Surface), "tcp://localhost:60001/RemoteSurface");
                // -- OU --
                // --- B - CAO ------ activé cote client
                System.Runtime.Remoting.RemotingConfiguration.RegisterActivatedClientType(typeof(NET2CsRemoting.Server.Surface), "tcp://localhost:60001");
                oSurface = new NET2CsRemoting.Server.Surface();
 
              
                // 2 Dialogue - apppel de méthodes
                Result = oSurface.CalculateSquareSurface(Convert.ToSingle(textBox1.Text));
               
                // Affichage du résultat formaté
                lblResult.Text = Result.ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }
    }
}

Partager cet article

Repost 0
Published by Romagny13 - dans C 1.0- 2.0- 3.0
commenter cet article

commentaires