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

Windows Communication Foundation .NET Discussion :

Client qui se bloque après plusieurs appelles serveur


Sujet :

Windows Communication Foundation .NET

  1. #1
    Membre du Club Avatar de Takumi
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2009
    Messages : 163
    Points : 62
    Points
    62
    Par défaut Client qui se bloque après plusieurs appelles serveur
    Bonjour,

    Développant une petite application de chat en C# à l'aide de WPF/WCF pour mes examens, je me heurte à un petit problème assez gênant. J'ai donc une application cliente et une serveur. L'utilisateur doit pour pouvoir communiquer avec d'autre personne se connecter au serveur en précisant un pseudo. Ce pseudo doit être unique. Lors de l'appelle à la méthode SeConnecter() de mon service, j'envoie en paramètre un objet de type User qui est une class que j'ai crée contenant deux attributs(le pseudo qui est un string, et l'état de la personne[en ligne,absent]).
    Quand la personne écrit son nom et valide, si la première fois tout est bon elle sera connecté. Cependant si le pseudo est déjà pris, le serveur va appeler une méthode côté client que j'ai appelé RaiseError() qui me permet d'afficher les erreurs du serveur.
    Mon problème se trouve dans le cas où l'utilisateur envois un pseudo déjà pris. Quand je clique 2-3 fois sur se connecter à la suite avec un pseudo occupé ça passe, mais dès que je m'amuse à cliquer plein de fois à la suite au bout de 7-10 cliques, le client ne réagis plus sans pour autant planter. Soit il se débloque tout seul au bout d'un certain temps, soit quand je ferme l'apllication serveur il se débloque. C'est assez embêtant si quelqu'un s'amuse à faire cela. Ensuite j'ai testé avec 2 clients ouverts je fais bloquer le premier, et quand je veux me connecter avec le deuxième il se bloque de suite et non pas au bout de plusieurs cliques.

    Voici quelques bout de code:

    La méthode qui est appelé quand on clique sur se connecter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    try
                {
                    this.Channel = new DuplexChannelFactory<Contrat.IServiceChat>(this, "Server");
                    this.Channel.Open();
                    this.Action = this.Channel.CreateChannel();
     
                    this.Me = new User(){Username = this.txtPseudo.Text, Status = User.State.Online};
                    this.Action.SeConnecter(this.Me);
                }
                catch(Exception err)
                {
                    this.RaiseError("Impossible de joindre le serveur");
                }
    La méthode SeConnecter de mon service:
    Code : 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
    public void SeConnecter(User User)
            {
                Boolean Exist = ServiceChat.UserList.Exists(delegate(User Utilisateur) {
                   return Utilisateur.Username == User.Username;
                });
     
                if(!Exist)
                {
                    lock (ServiceChat.UserList)
                    {
                        this.Callback.UserConnected(ServiceChat.UserList); //envois la liste des utilisateurs déjà connectés
                        if (ServiceChat.NewUserEnteredEvent != null)
                            ServiceChat.NewUserEnteredEvent(this, new NewUserEnteredEventArgs() { User = User });
     
                        ServiceChat.UserList.Add(User);
                        ServiceChat.EnvoyerMessageEvent += this.EnvoyerMessageHandler;
                        ServiceChat.NewUserEnteredEvent += this.NewUserEnteredHandler;
                        ServiceChat.UserDisconnectedEvent += this.UserDisconnectedHandler;
                        this.User = User;
                    }
                }
                else
                    this.Callback.RaiseError("Un utilisateur est déjà connecté avec ce nom");
            }
    Et la méthode RaiseError avec laquelle j'affiche mes erreurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void RaiseError(string Error)
            {
                Paragraph P = new Paragraph(new Run(Error));
                P.Foreground = Brushes.Red;
                this.richConv.Document.Blocks.Add(P);
            }
    *Le this.richConv est un RichTextBox.

    J'espère que vous sauriez m'aider à trouver mon erreur. Je n'arrive vraiment pas à voir d'où vient le problème, surtout débutant avec WCF.

    Je vous remercie d'avance

  2. #2
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 63
    Points : 48
    Points
    48
    Par défaut
    Je me plante peut être totalement mais lorsque tu te connecte avec un pseudo déjà utilisé, c'est le catch du client qui appelle RaiseError, ne serais-ce pas plus simple d'utiliser un WCF en Duplex tel que NetTCP ou wsDualHttpBinding pour que ce soit le serveur qui appelle la méthode du client ?

    Lorsque tu arrive dans la methode SeConnecter du serveur tu check si le pseudo est disponible si oui tu continu comme avant sinon tu fait client.RaiseError.

    Mais c'est déjà peut être ça que tu fais car je vois un callback donc si tu pouvais me montrer où est défini ton callback ça m'aiderait.

  3. #3
    Membre du Club Avatar de Takumi
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2009
    Messages : 163
    Points : 62
    Points
    62
    Par défaut
    Bonsoir,

    Le premier bloque de code que j'ai mis concernait le client. Je tente de le connecter, pour cela je fais un try catch, si il y a une erreur (par exemple la communication passe à Faulted) hop message d'erreur, sinon on appelle la méthode du serveur "Se connecter".

    Lorsque tu arrive dans la methode SeConnecter du serveur tu check si le pseudo est disponible si oui tu continu comme avant sinon tu fait client.RaiseError.

    Mais c'est déjà peut être ça que tu fais car je vois un callback donc si tu pouvais me montrer où est défini ton callback ça m'aiderait.
    Ma méthode Se connecter de mon service fais bien déjà cela, elle check si le pseudo est pas déjà utilisé. Si c'est le cas on appelle RaiseError qui se trouve chez le client, sinon je fais tous mon traitement. Quand tu me demandes où est défini mon callback, tu veux dire quoi plus exactement?

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 63
    Points : 48
    Points
    48
    Par défaut
    Je te demandais où et comment était défini ta variable this.Callback

  5. #5
    Membre du Club Avatar de Takumi
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2009
    Messages : 163
    Points : 62
    Points
    62
    Par défaut
    Bonsoir,

    Désolé de pas avoir répondus plus tôt mais j'avais commencé un autre truc laissant ce problème de côté temporairement. J'ai finalement trouvé un truc pour le corriger. En faite il se trouvais que quand je cliquais sur se connecter c'était le moment ou je crée ma connexion avec le service côté serveur. Donc j'ai rajouté une condition qui vérifie si ma connexion a pas déjà été crée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(this.Action == null)
    {
         this.Channel = new DuplexChannelFactory<Contrat.IServiceChat>(this.Callback, "Server");
         this.Action = this.Channel.CreateChannel();
    }
    Maintenant j'ai plus ce problème de bloquage. Je me demande quand même quelle est la cause exacte du problème, qu'est ce qui faisait qu'à un moment mon client bloquais et se déconnectais.

    Sinon pour répondre tout de même à ta question ma variable this.callback était présente dans la classe du service côté serveur et était initalisé à la construction de la classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession,ConcurrencyMode = ConcurrencyMode.Single)]
    public class ServiceChat : IServiceChat
    {
        private IChatCallback Callback;
     
     
        public ServiceChat()
        {
            this.Callback = OperationContext.Current.GetCallbackChannel<IChatCallback>();
        }
    }

Discussions similaires

  1. Serveur socket multi client qui bloque sur le premier client
    Par cyclopsnet dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 07/05/2014, 21h31
  2. Réponses: 10
    Dernier message: 22/07/2011, 00h04
  3. Images visibles même avec client qui les bloque
    Par php_de_travers dans le forum E-Mailing
    Réponses: 0
    Dernier message: 30/12/2009, 22h27
  4. Réponses: 5
    Dernier message: 10/07/2009, 22h43
  5. [C#] [MSDE] Connexion qui se ferme après appel de fonction
    Par trotters213 dans le forum Windows Forms
    Réponses: 11
    Dernier message: 23/03/2005, 16h30

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