IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Framework .NET Discussion :

[2.0][.Net Remoting]Comment gérer la connection/déconnection d'une applicat. cliente?


Sujet :

Framework .NET

  1. #1
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut [2.0][.Net Remoting]Comment gérer la connection/déconnection d'une applicat. cliente?
    Bonjour,

    j'ai crée une application distribuée qui utilise .Net Remoting.
    L'application cliente se connecte correctement à l'application serveur.
    J'utilise un fichier de configuration.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Initialisation de la configuration du client
    RemotingConfiguration.Configure("Client.config", false);
     
    // Initialisation de l'objet de fabrication des objets distants
    m_RemoteFabrique = (ITraitementFabriqueService)RemoteInterfaceInitializer.GetObject(typeof(ITraitementFabriqueService));

    RemoteInterfaceInitializer est :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    public class RemoteInterfaceInitializer
        {
            private static bool bInit;
     
            // Table d'association:interfaces/services distants WKO
            private static IDictionary dicoTypes;
     
            public static Object GetObject(Type type)
            {
                if (!bInit)
                    InitDicoTypes();
                WellKnownClientTypeEntry entry = (WellKnownClientTypeEntry)dicoTypes[type];
     
                return Activator.GetObject(entry.ObjectType, entry.ObjectUrl);
            }
     
            private static void InitDicoTypes()
            {
                bInit = true;
                dicoTypes = new Hashtable();
     
                foreach (WellKnownClientTypeEntry entry in RemotingConfiguration.GetRegisteredWellKnownClientTypes())
                {
                    dicoTypes.Add(entry.ObjectType, entry);
                }
            }
        }

    Comment puis-je gérer la déconnection du client au serveur ?
    De même côté serveur, j'aimerais que l'application serveur soit un service Windows.
    Le serveur est initialisé de la façon suivante:

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    /// <summary>
            /// Démarrage du serveur
            /// </summary>
            public void Start()
            {
                // Configuration du serveur d'accès distant
                RemotingConfiguration.Configure("Hote.config", false);
     
                log.Info("Serveur de gestion démarré.");
     
                // Indique que le serveur est démarré
                m_Started = true;
            }
     
            public void Stop()
            {
                 // Arrêter le serveur
             }

    Comment puis-je interrompre les connections du côté serveur (Que mettre dans la méthode Stop() ?)
    Comment le client peut-il être notifié d'un arrêt du serveur ?

    Dans le cas où la connection n'est plus valide, il faudrait que mon client se reconnecte sur le serveur. Comment gérer les reconnection d'un client au serveur ?

    Merci d'avance pour votre aide.

  2. #2
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Bonjour,

    pas de réponse !
    mon message n'est peut-être pas suffisamment clair.
    Je vais tâcher d'être plus explicite.

    Supposons que je lance mon application serveur, puis mon application cliente. Mon application cliente se connecte correctement à l'application serveur.

    Supposons qu'un problème survienne sur mon serveur, et ce dernier se ferme.
    Je relance le serveur.
    Comment puis-je faire pour que mon application cliente se reconnecte à l'application serveur sans devoir la refermer et la réouvrir ?
    J'ai essayé de réinitialiser mes interfaces mais un message d'erreur apparaît me disant qu'elles ont déjà été initialisées.

    Merci d'avance pour votre aide.

  3. #3
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Salut .

    Tu poses le doigt sur un des principaux problème des applications distribué (ou distante comme tu veux) .

    Pouré repondre à la question la plus simple : Comment faire pour détecter que le serveur est mort et qu'il est relancé ?

    Ben tout simplement avec un magnifique try/catch non ? Si tu tentes d'accéder à un objet remoting alors que le serveur est down tu aura une exception de connection au serveur. A ce moment la a toi de voir quoi mettre en place :
    - un delai d'attente pour que le serveur puisse remonter si tu es sur que le serveur va redémarrer sans intervention
    - un buffering local (attention aux implication de cette méthode : tu doit avoir la définition des classes cotés serveur ET client)
    - un message d'erreur et basta

    bon ça c'est la réponse simple

    Plus compliqué : Comment informer les clients que le serveur va être arreté ?

    Deux cas de figure :
    - Le serveur est prioritaire sur les clients : C a d que le serveur doit s'arreter quoi qu'il arrive sans délais (ou très peu) : dans ce cas tu lances un avertissement aux clients de façon a ce qu'ils envoient les données non sauvegardés immédiatement. Tu lance un thread avec un timer assez court qui sera chargé de tuer tout les clients ne s'ayant pas arreté dans le délai imparti. La probalité de perte de données varie en fonction de la qualité du réseau, du nombre de clients, de la charge serveur, du temps accordé aux clients pour stopper, etc, etc, etc.

    deuxieme cas de figure :
    - Les clients sont prioritaires : Dans le cas ou aucune données ne peut/ne doit être perdu il faut laisser le client maitre de l'opération. c a d que ton serveur lance un apple à shutdown aux clients et qu'il se met en attente de la déconnection des clients sans aucun controle de durée. Evidement pendant ce temps il ne doit accepter aucune connection . Le problème principale de cette façon de faire c'est qu'un client qui en a encore pour 3 jour, ben ton serveur va encore tourner 3 jours...

    Bien evidement rien ne t'empeche de mixer les deux méthodes

  4. #4
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Bonjour,

    je te remercie pour ta réponse très interessante.
    Je vais étudier ces deux possibilités.

    c a d que ton serveur lance un apple à shutdown aux clients et qu'il se met en attente de la déconnection des clients sans aucun controle de durée.
    En Remoting, quelque chose existe déjà ou il faut simplement utilisé un Evenement Shutdown que lancera le serveur ?

    Il m'avait semblé que tu connaissais plutôt bien Remoting par les messages que tu as laissé sur le forum.
    Pour les deux cas de figures, le client se fermera quoiqu'il arrive mais est-il possible de le laisser ouvert:

    Saurais-tu comment un client peut se reconnecter à un serveur sans devoir refermer l'application cliente et la réouvrir, enfin si c'est possible.
    En effet, si le serveur se ferme, le client reste ouvert.
    Si j'essaie de réinitialiser la configuration du client
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Initialisation de la configuration du client
    RemotingConfiguration.Configure("Client.config", false);

    une exception RemotingException est lancé avec message:

    Echec de la configuration d'accès distant avec l'exception 'System.Runtime.RemotingException': Le nom de l'application distante 'Client' a déjà été défini.
    Merci d'avance pour ton aide.

  5. #5
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Citation Envoyé par Pilloutou
    En Remoting, quelque chose existe déjà ou il faut simplement utilisé un Evenement Shutdown que lancera le serveur ?
    A brule pour point il n'existe rien qui te suffise. Je te conseil de passer par l'appel d'une méthode ou par un évènement afin que ton client et/ou ton serveur lance les taches d'arret (comme par exemple supprimer le client de la liste du serveur )

    Citation Envoyé par Pilloutou
    Il m'avait semblé que tu connaissais plutôt bien Remoting par les messages que tu as laissé sur le forum.
    J'avais commencé à m'interessé de près puis le destin (aussi bien que le boulot) m'a forcé à relacher mon attention de cette partie du framework



    Citation Envoyé par Pilloutou
    Saurais-tu comment un client peut se reconnecter à un serveur sans devoir refermer l'application cliente et la réouvrir, enfin si c'est possible.
    En effet, si le serveur se ferme, le client reste ouvert.
    Si j'essaie de réinitialiser la configuration du client
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Initialisation de la configuration du client
    RemotingConfiguration.Configure("Client.config", false);
    Il ne faut pas relancer toute la configuration coté client mais juste réinstancier l'objet.

Discussions similaires

  1. [CF][PPC/VB.NET/Datagrid] Comment gérer une colonne CheckBox ?
    Par joefou dans le forum Windows Mobile
    Réponses: 5
    Dernier message: 28/08/2006, 17h08
  2. Réponses: 9
    Dernier message: 13/04/2006, 11h40
  3. [.NET Remoting] Comment transferer un Dataset ?
    Par B.AF dans le forum Framework .NET
    Réponses: 2
    Dernier message: 30/12/2005, 22h34
  4. Réponses: 5
    Dernier message: 28/11/2005, 09h52
  5. Réponses: 5
    Dernier message: 25/07/2005, 09h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo