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:
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 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"); }
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
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"); }
*Le this.richConv est un RichTextBox.
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); }
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
Partager