Bonjour,
Présentation du projet:
Je travaille actuellement sur un projet consistant à créer un chat en c#. Pour cela, j'ai développé une IHM qui correspond à un client ainsi que mon serveur.
Actuellement, un client peut communiquer avec tous les autres clients connectés au serveur.
Maintenant j'aimerais pouvoir lister les différents clients connectés sur le serveur. Que le serveur envoit cette liste à chaque client (en l'actualisant). A partir de ce moment là, le client peut sélectionner un interlocuteur en particulier pour ne discuter que avec lui.
Le point qui pose problème:
J'enregistre les différents clients dans un Hashtable. Le Hashtable est constitué ainsi: une clé correspond à un indice (int) et est associé à une valeur correspondant au nom du client (string).
J'envoie donc au client qui vient de se connecter la liste parcourant mon Hastable à l'aide d'un foreach. De plus, pour différencier un message "classique" du nom d'un utilisateur, je fais précéder le nom par un ?. Le problème étant que mon client récupère toutes les valeurs dans un seul string (à savoir ma variable correspondant à inStream).
Voici mon code qui envoit la liste à un client (donc coté serveur):
Voici mon code de réception coté client:
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 public static void broadcastNewClient(TcpClient socket, bool flag) { TcpClient broadcastSocket; broadcastSocket = socket; foreach (DictionaryEntry Item in clientsList) { int nb = clientsList.Count; NetworkStream broadcastStream = broadcastSocket.GetStream(); string msg = "?" + Item.Key; Byte[] broadcastBytes = null; if (flag == true) { broadcastBytes = Encoding.ASCII.GetBytes(" says : " + msg); } else { broadcastBytes = Encoding.ASCII.GetBytes(msg); Console.WriteLine("Le nom est: {0}", Item.Key); } broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length); broadcastStream.Flush(); }
Tout ceci m'amène à penser que je rencontre un problème dans ma lecture des données. Plus particulièrement, je pense que le problème vient du fais que la taille défini pour inStream (10025) est bien trop grand par rapport aux noms des utilisateurs. Qu'en pensez-vous? Auriez-vous d'autres idées?
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
25
26
27
28
29
30
31
32
33
34
35
36
37 private void getMessage() { while (clientSocket.Connected) { try { serverStream = clientSocket.GetStream(); int buffSize = 0; byte[] inStream = new byte[10025]; buffSize = clientSocket.ReceiveBufferSize; serverStream.Read(inStream, 0, buffSize); serverStream.Flush(); string returndata = System.Text.Encoding.ASCII.GetString(inStream); /****************************/ NameList.Items.Clear(); if (returndata.Substring(0, 1) == "?") { users[i] = returndata; i++; } NameList.BeginUpdate(); for (int m = 0; m < i; m++) { NameList.Items.Add(users[m]); } NameList.EndUpdate(); /****************************/ readData = "" + returndata; } catch (InvalidOperationException e) { Console.WriteLine("Invalid operation exception: {0}", e); } catch (ArgumentNullException e) { Console.WriteLine("Argument null exception: {0}", e); } catch (ArgumentOutOfRangeException e) { Console.WriteLine("Argument out of range exception: {0}", e); } catch (IOException e) { Console.WriteLine("IOException: {0}", e); } msg(); } }
Par avance merci pour votre aide.
Partager