Bonjour, je suis entrain de développer une application client/serveur en utilisant TCPClient et TCPListener. Bon au début tout marchait bien puisque j'envoie des chaines de caractères. Là j'envoie plusieurs types d'objet au serveur et selon le type j'exécute une fonction. Mon problème que le serveur exécute uniquement une seule demande du client et ne peut pas exécuter d'autre demandes malgré que j'ai créé des threads.
Voilà le code de la partie client (A partir d'un formulaire le client se connecte à l'application et là j'ouvre une nouvelle fenêtre qui va manipuler le même objet TCPClient :
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
 
private void btnConnexion_Click(object sender, EventArgs e)
        {
          try
          {
            client = new TcpClient(serveur, port);
 
                identClient.LoginClient = txtLogin.Text.ToString();
                identClient.PasswordClient = txtPassword.Text.ToString();
                //identClient.LoginConnexionClient = "Authentification";
                fluxClient = client.GetStream(); // the stream
 
                #region Envoyer le login et le mot de passe au serveur
                if (fluxClient.CanWrite)
                {
                    MemoryStream ms = new MemoryStream();
                    IFormatter bf = new BinaryFormatter();
                    bf.Serialize(ms, identClient);
                    byte[] writerbuffer = ms.GetBuffer();
                    fluxClient.Write(writerbuffer, 0, writerbuffer.Length);
                    ms.Close();
                }
                #endregion
 
                #region Désérialisation et récupération de la réponse du serveur
 
                if (fluxClient.CanRead)
                {
                    byte[] data = new byte[client.ReceiveBufferSize];
                    MemoryStream ms2 = new MemoryStream(data);
                    fluxClient.Read(data, 0, (int)client.ReceiveBufferSize);
                    IFormatter formatter = new BinaryFormatter();
                    Object obj = (Object)formatter.Deserialize(ms2);
                    if (obj.GetType() == typeof(bool))
                    {
                        connecte = (bool)obj;
                        if (connecte == false)
                            MessageBox.Show("Votre login et mot de passe est incorrect !");
                    }
                    else if (obj.GetType() == typeof(DataTable))
                    {
                        dt = (DataTable)obj;
                        FormMessage f1 = new FormMessage(this);
                        f1.Show();
                        this.Close();
 
                    }
                    ms2.Close();
                }
                else
                {
                    MessageBox.Show("Impossible de lire");
                }
                #endregion
 
                //fluxClient.Flush();
 
          } 
          catch (Exception E) 
          {
              MessageBox.Show(E.StackTrace);
          }
        }
Pour le 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
 
 serverThread = new Thread(new ThreadStart(lancerServeur));
            serverThread.Start();
protected void lancerServeur()
        {
            try
            {
 
                server = new TcpListener(localAddrServer, portServer);
                server.Start();
 
                String str = "Serveur lancé, Attend des nouvelles connexions";
                bool val = true;
 
                this.Invoke(this.LabelDelegate, new object[] { str, val });
 
                while (true)
                {
                    serviceClient = server.AcceptTcpClient();
                    fluxClient = serviceClient.GetStream();
                    if (serviceClient.Connected == true)
                    {
                        Clients.Add(serviceClient);
                        serviceThreadLecture = new Thread(new    ThreadStart(ListenToClient));
                        serviceThreadLecture.Start();
                    }
                }
            }
            catch (Exception E)
            {
                MessageBox.Show(E.Message.ToString());
            }
        }
Chaque client connecté est géré par un thread qui lance la fonction ListenToClient.

voilà son code :
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
 
public void ListenToClient()
        {
 
            Thread thread = null;
            MessageBox.Show("Listen");
            if (fluxClient.CanRead)
            {
                #region Désérialisation et récupération de la demande sous forme d'objet qui a plusieurs types
                byte[] data = new byte[serviceClient.ReceiveBufferSize];
                MemoryStream ms2 = new MemoryStream(data);
                fluxClient.Read(data, 0, (int)serviceClient.ReceiveBufferSize);
                IFormatter formatter = new BinaryFormatter();
                Object objetrecu = formatter.Deserialize(ms2);
                //MessageBox.Show(objetrecu.GetType().ToString());
                ms2.Close();
                #endregion
 
                if (objetrecu.GetType() == typeof(IdentificationClient))
                {
                    identClient = (IdentificationClient)objetrecu;
                    thread = new Thread(new ThreadStart(ListenAuthentification));
                    thread.Start();
                }
                else if (objetrecu.GetType() == typeof(EnregistrerClient))
                {
                    nouvClient = (EnregistrerClient)objetrecu;
                    thread = new Thread(new ThreadStart(ListenEnregistrementClient));
                    thread.Start();
                }
                else if (objetrecu.GetType() == typeof(GetInfoReponseMessage))
                {
                    MessageBox.Show("dsfsfsfsddfs");
                    infoReponse = (GetInfoReponseMessage)objetrecu;
                    thread = new Thread(new ThreadStart(ListenGetReponse));
                    thread.Start();
                }
            }
 
        }
Le problème que cette fonction s'exécute une seule fois par exemple je ne peux pas exécuter le thread associé à la dernière méthode "ListenGetReponse". Je coirs que cette fonction s'exécute uniquement une seule fois comment je fais pour que cette fonction reste en attente des messages de la socket connectée.

Merci