[C#][Sockets] Ecouter plusieurs clients

mecano14 Messages postés 35 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 12 août 2006 - 29 juil. 2006 à 14:06
xankow Messages postés 10 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 8 juillet 2008 - 19 juin 2008 à 16:19
Bonjour,
Je travaille en ce moment sur un petit programme de chat
Je recontre un problème pour la connection de plusieurs clients

Lorsqu'un seul client se connecte ca fonctionne bien mais lorsqu'un deuxieme essai, ses messages ne sont pas pris en compte.
Je me pose la question suivante:
Est ce que je dois instancier un TcpListener pour chaque client du coté serveur ou un seul suffit pour tous?

Voici ce que je fais du coté serveur

Lorsqu'il demarre
IPEndPoint ipServerEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);

// initialisation de la socket d'ecoute
socket_ecoute = new TcpListener(ipServerEndPoint);

// Mise en marche de la socket
socket_ecoute.Start();
                       
// Creation d'une thread au chargement associé a la fontion Ecoute()
th = new Thread(new ThreadStart(Ecoute));
th.Start() ;
Console.WriteLine("Chat demarré et sur ecoute");

public void Ecoute()
        {
  
                MySocket = socket_ecoute.AcceptSocket();
     
                //attente de donnée arrivant du Client avec une boucle infinie
                while(stop)
                {

                    // on met les bytes recuperé dans le tableau
                   
                        // Creation d'un tableu de byte pour contenir les donnés reçu
                        Byte[] buffer = new Byte[1024];
                       
                        MySocket.Receive(buffer);

                        //On traduit les Bytes en caractère ASCII lisible
                        string data = Encoding.ASCII.GetString(buffer).TrimEnd('\0');

                        // On envoi le texte aux clients
                        if (data != "")
                        {
                            Console.WriteLine(data);

                            EnvoieAuClient(MySocket, data);

                        }

                }

}

Merci :)
A voir également:

18 réponses

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
29 juil. 2006 à 15:30
Salut

C'est normal. La facon dont tu as structuré le serveur te permet d'accepter qu'un seul client

En fait tu n'as besoin de qu'un TCPListener.
Cependant, il faut boucler sur le AcceptSocket();

Quand un Client se connecte, AcceptSocket te retourne un socket, qui te permet de connecter avec le client. Il faut que tu stockes ce Socket (tableau, List<Socket>, ou autre).
Mais il faut ensuite que tu rappelles AcceptSocket(); pour tous les clients qui se connecteront par la suite.

Donc en gros, il te faut un Thread d'ecoute de connexion des clients et qui ne fait que ca, en boucle, et un autre thread (ou plusieurs) qui te permettent la communication avec ces clients

Petite fonction d'exemple dans un de mes codes
J'avais une Classe Client qui me permettait de stocker toutes les infos sur eux (Socket, identifiants, ...)
Je stockait chaque client dans une List<Client>
Cette fontion etait appelée dans un Thread de la meme facon que toi tu le fais dans ton code.

<hr />

private
void ListenToClients()
{

   Console.WriteLine(
"En attente de clients...");

   while (listen)
   {

         // La méthode AcceptSocket est bloquante, donc tant qu'il n'y a pas de connexion
         // l'execution de la méthode s'arrete a cette ligne
         Socket socket =
this.tcpListener.AcceptSocket();

         Console.WriteLine(
string.Format(
"Connexion du client {0}",
this.idClient));

         lock (
this.clientsList)
         {

            // On cree un nouveau client
            Client client =
new
Client(socket, idClient++);

            // On l'ajoute a notre liste de clients
            this.clientsList.Add(client);
         }
   }
}
<hr />

Mx
MVP C# 
0
Rejoignez-nous