Bonsoir à tous,

après une multitude d'essais et de recherches sans résultat, je me permet de poster afin d'obtenir votre aide qui me sera des plus précieuses.
Je suis actuellement sur un projet de tchat, j'utilise les sockets et les clients-serveur communiquent bien, enfin pas tout à fait.

En fait, sur la fenêtre du Client, un RichTextBox est prévu pour les messages transmis entre utilisateurs. Une 2eme RichTextBox est là pour afficher la liste des personnes connectées.

Mon problème le + en détails possible, et ensuite le code:

- Au démarrage du serveur, si je connecte un client, il m'affiche correctement le pseudo de l'unique client connecté (puisque je viens de démarrer le serveur) dans la liste des Pseudos prévue à cet effet. Il m'affiche également un message comme quoi un nouveau client s'est connecté, et ce dans la liste des discussions. Tout va bien jusque là.
- Si j'écris un message, alors que je suis toujours tout seul sur le tchat, ca fonctionne également.
- et c'est ICI que ça va plus: si je connecte un 2eme client, dans le RichTextBox des discussions de ce dernier, il m'affiche le message de bienvenue + la liste des clients connecté! Il ne sait pas séparer les 2 pour afficher les clients en ligne dans la zone prévue pour!

--> en revanche sur mon premier client, il a tout bon, il fait tout comme il faut! Et quand j'envoie un message que ce soit d'un client ou de l'autre, c'est bon aussi, il l'affiche dans le bon RichTextBox.

Donc la je sèche, je vous poste mon code dans l'espoir que vous puissiez m'aider:

SERVEUR:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
class Program
    {
        public static Hashtable clientsList = new Hashtable();
 
        static void Main(string[] args)
        {
            TcpListener serverSocket = new TcpListener(50882);
            TcpClient clientSocket = default(TcpClient);
            serverSocket.Start();
            counter = 0;
            while (true)
            {
                counter += 1;
                clientSocket = serverSocket.AcceptTcpClient();
 
                byte[] bytesFrom = new byte[10025];
                string dataFromClient = null;
 
                NetworkStream networkStream = clientSocket.GetStream();
                networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
                dataFromClient = System.Text.Encoding.UTF8.GetString(bytesFrom);
 
                dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
 
                clientsList.Add(dataFromClient, clientSocket); //dataFromClient est le pseudo (KEY), clientSocket le socket (VALUE)
 
                Console.WriteLine("(" + DateTime.Now.ToString() + ") Connexion de: " + dataFromClient);
                handleClinet client = new handleClinet();
                client.startClient(clientSocket, dataFromClient, clientsList);
 
                broadcast("Serveur: " + dataFromClient + " est maintenant en ligne!\n", dataFromClient, false);
            }
 
            clientSocket.Close();
            serverSocket.Stop();
            Console.WriteLine("(" + DateTime.Now.ToString() + ") Serveur hors service...");
            Console.ReadLine();
        }
 
        public static void broadcast(string msg, string uName, bool flag)
        {
            foreach (DictionaryEntry client in clientsList)
            {
                TcpClient SocketClient;
                SocketClient = (TcpClient)client.Value; //Récupère le socket du client
                NetworkStream Flux = SocketClient.GetStream(); //Flux du client
 
                if (flag == true) //Message du client
                {
                    Byte[] broadcastBytes = null;
 
                    broadcastBytes = Encoding.UTF8.GetBytes(uName + " : " + msg + "\n"); //Ex: "Tib : Coucou!"
                    Flux.Write(broadcastBytes, 0, broadcastBytes.Length);
                    Flux.Flush();
                }
                else //Pseudo vient de se connecter
                {
                    Byte[] broadcastBytes = null;
                    Byte[] broadcastPseudo = null;
 
                    ICollection clientsKeys = clientsList.Keys;
                    StringBuilder listePseudos = new StringBuilder();
 
                    listePseudos.Insert(0, "#");
                    string listeStr = "";
 
                    foreach (object Key in clientsKeys)
                    {
                        listePseudos.AppendLine(Key.ToString());
                    }
 
                    listeStr = listePseudos.ToString();
 
                    broadcastBytes = Encoding.UTF8.GetBytes(msg); //Message d'avertissement de connexion
                    Flux.Write(broadcastBytes, 0, broadcastBytes.Length);
                    Flux.Flush();
 
                    broadcastPseudo = Encoding.UTF8.GetBytes(listeStr); //Envoi de la liste des pseudos
                    Flux.Write(broadcastPseudo, 0, broadcastPseudo.Length);
                    Flux.Flush();
                }
                #endregion
            }
        } 
    }
 
public class handleClinet
    {
        TcpClient clientSocket;
        string clNo;
        Hashtable clientsList;
 
        public void startClient(TcpClient inClientSocket, string clineNo, Hashtable cList)
        {
            this.clientSocket = inClientSocket;
            this.clNo = clineNo;
            this.clientsList = cList;
            Thread ctThread = new Thread(doChat);
            ctThread.Start();
        }
 
        public void stopClient(TcpClient inClientSocket, string clineNo, Hashtable cList)
        {
            this.clientSocket = inClientSocket;
            this.clNo = clineNo;
            this.clientsList = cList;
            Thread ctThread = new Thread(doChat);
        }
 
        private void doChat()
        {
            int requestCount = 0;
            byte[] bytesFrom = new byte[10025];
            string dataFromClient = null;
            string rCount = null;
            requestCount = 0;
 
            while (true)
            {
                if (clientSocket.Connected == true)
                {
                    try
                    {
                        requestCount = requestCount + 1;
                        NetworkStream networkStream = clientSocket.GetStream();
                        networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
                        dataFromClient = System.Text.Encoding.UTF8.GetString(bytesFrom);
                        if (dataFromClient.Length > 0)
                        {
                            dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
                            Console.WriteLine("(" + DateTime.Now.ToString() + ") " + clNo + " dit : " + dataFromClient);
                            rCount = Convert.ToString(requestCount);
 
                            Program.broadcast(dataFromClient, clNo, true);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("(" + DateTime.Now.ToString() + ") Déconnexion de " + clNo);
                        clientsList.Remove(clNo);
                        ICollection clientsKeys = clientsList.Keys;
                        StringBuilder listePseudos = new StringBuilder();
                        string listeStr = "";
                        listePseudos.Insert(0, "#");
 
                        foreach (object Key in clientsKeys)
                        {
                            listePseudos.AppendLine(Key.ToString());
                        }
 
                        listeStr = listePseudos.ToString();
 
                        foreach (DictionaryEntry Item in clientsList)
                        {
                            TcpClient broadcastSocket;
                            broadcastSocket = (TcpClient)Item.Value; //Récupère le socket du client
 
                            NetworkStream broadcastStream = broadcastSocket.GetStream(); //Flux du client
                            Byte[] broadcastBytes = null;
 
                            broadcastBytes = Encoding.UTF8.GetBytes(clNo + " n'est plus en ligne...\n"); //Message d'avertissement de déconnexion
                            broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length);
                            broadcastStream.Flush();
                            broadcastBytes = Encoding.UTF8.GetBytes(listeStr); //Envoi de la liste des pseudos
                            broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length);
 
                            broadcastStream.Flush();
                        }
                        clientSocket.Close();
                    }
                }
                else
                {
                    clientSocket.Close();
                }
            }
        }
    } 
}
Et côté client j'ai:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
    public partial class Frm_Connexion : Form
    {
        System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
        NetworkStream serverStream = default(NetworkStream);
        string readData = null;
 
        #region EnvoiPSeudo
        private void EnvoiPseudo()
        {
            serverStream = clientSocket.GetStream();
 
            byte[] outStream = System.Text.Encoding.UTF8.GetBytes(TxtBox_Pseudo.Text + "$");
            serverStream.Write(outStream, 0, outStream.Length);
            serverStream.Flush();
 
            Thread ctThread = new Thread(ReceptionDonnees);
            ctThread.Start();
        }
        #endregion
 
        #region EnvoiMessage
        private void Btn_Envoyer_Click(object sender, EventArgs e)
        {
            byte[] outStream = System.Text.Encoding.UTF8.GetBytes(TxtBox_Message.Text + "$");
            serverStream.Write(outStream, 0, outStream.Length);
            serverStream.Flush();
 
            TxtBox_Message.Clear();
        }
        #endregion
 
        #region ReceptionDonnees
        private void ReceptionDonnees()
        {
            while (true)
            {
                if (serverStream.CanRead == true)
                { 
                    serverStream = clientSocket.GetStream();
                    serverStream.Flush();
                    int buffSize = 0;
                    byte[] inStream = new byte[10025];
                    buffSize = clientSocket.ReceiveBufferSize;
                    serverStream.Read(inStream, 0, buffSize);
                    string returndata = System.Text.Encoding.UTF8.GetString(inStream);
                    readData = returndata;
                    msg();
                }              
            }
        }
 
        private void msg()
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new MethodInvoker(msg));
            }
            else
            {
                if (readData.StartsWith("#")) //Si commence par #, c'est la liste des pseudos
                {
                    RTxtBox_Contacts.Clear(); //On efface tous les pseudos de la liste
                    RTxtBox_Contacts.AppendText(readData.Remove(0, 1));
                }
                else //Sinon c'est un message
                {
                    RTxtBox_Discussion.AppendText(readData + "\n"); 
                }
            }
        }
}
Voila, j'utilise le caractère "#" dans le but de reconnaitre la liste des pseudos d'un message.

A la connexion du 2eme client, il m'affiche donc dans la zone des message ceci:

Serveur: Client2 est maintenant en ligne!
#Client1
Client2



Merci d'avance pour votre aide, en espérant avoir été assez précis!

Tib