IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Problème gestion multi-client via des sockets


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 11
    Par défaut Problème gestion multi-client via des sockets
    Bonjour,

    Je suis sur un projet de Chat Serveur/Client.
    Mon serveur est fait de tel sorte:
    L'initialisation du 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
    IPAddress[] addr = Dns.Resolve("").AddressList;
                    label_ip.Text = addr[0].ToString();
                    //Init socket serveur
                    sock_serveur = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    sock_serveur.Bind(new IPEndPoint(addr[0], 8001));
                    //On initialise la liste de clients
                    liste_client = new List<Client>();
                    //On initialise la liste de chatroom
                    liste_chan = new List<ChatRoom>();
                    //1èrer chatroom, celle qui servira de fil de discussion général
                    ChatRoom general = new ChatRoom("general");
                    text_chan.Text = "general";
                    //On l'ajoute à la liste des chatroom
                    liste_chan.Add(general);
                    //param serveur
                    sock_serveur.Listen(10);
    Un thread qui gère la connexion des clients:
    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
    private void wait_client()
            {
                while (true)
                {
                    //On accepte le Connect du client
                    Socket buf_sock = sock_serveur.Accept();
                    //On cré un client buffer que l'on ajoute ensuite à la liste des clients
                    buf_client = new Client(buf_sock);
                    liste_client.Add(buf_client);
                    //On stocke le nombre pour le thread suivant
                    nombre_sock_client = liste_client.Count;
                    this.Invoke(this.recept_nb_client, new object[] { nombre_sock_client.ToString() });
                    //Thread de communication
                    Thread reception = new Thread(new ThreadStart(ThreadProcess));
                    reception.IsBackground = true;
                    reception.Start();
                }
            }
    A chaque fois qu'un client se connecte, je stocke le socket via une liste de clients.
    A chaque fois qu'un message est envoyé, je le gère via un système de flag.

    Coté client, un Form demande le nom du client puis une fois saisie, il envoi un connect au serveur.
    Tout se passe très bien pour un client, mais dès qu'un deuxième client se connecte, je n'arrive plus à envoyer de message depuis le 1er client. Et ainsi de suite, si un 3ème se connecte, le 2ème ne peut plus non plus écrire. Ils reçoivent pourtant tous les messages venant du dernier connecté.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // Ajouter un client
                        client = new Client(textBox_pseudo.Text, textBox_mdp.Text, null);
                        IPAddress[] addr = Dns.Resolve("").AddressList;
                        IPAddress ipAd = addr[0];
                        client._socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        client._socket.Connect(ipAd, 8001);
                        // Envoie du msg au serveur
                        Message msgbuf = new Message(0, "serveur", textBox_pseudo.Text, textBox_pseudo.Text);
                        msgbuf.envoi_msg(msgbuf, client);
                        // Ouverture du Chat Room
                        Form_Acceuil acceuil = new Form_Acceuil(client);
                        this.Visible = false;
                        acceuil.Visible = true;
    La classe Client contient le nom d'un client le socket qui le lie au serveur.
    Et voici la fonction permettant d'envoyer des messages:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string json = JsonConvert.SerializeObject(msg);
                int nbByteSent = client._socket.Send(Encoding.UTF8.GetBytes(json));
    Quelqu'un aurait-il une idée de ce qui peut provoquer cela? D'après mes test personnels, les clients envoient bien les messages, mais ils ne sont pas reçus par le serveur (quand ils ne viennent pas du dernier connecté...)

    Merci d'avance!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ton code m'a l'air bien écrit et bien organisé. Après je n'ai pas vérifié les différents paramètres...

    Au vu de la description de ton problème il me semble que cela proviendrait peut-être de la fonction "ThreadProcess" dont tu ne nous as pas montré le code.
    Peut-on voir le code de "ThreadProcess"?

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 11
    Par défaut
    Bonjour,

    merci de ta réponse :-)

    Voici ma fonction ThreadProcess:
    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
    private bool ok = true;
            private void ThreadProcess()
            {
                while (ok)
                {
                    try
                    {
                        Byte[] rep = new Byte[40000];
                        clientbuf._socket.Receive(rep);
                        string srep = Encoding.ASCII.GetString(rep);
                        Message buf = JsonConvert.DeserializeObject<Message>(srep);
                        //Si on reçoit un message d'un autre user // CHAT
                        if (buf.flag == 2 )
                        {
                            Console.WriteLine("chez :" +buf.flag+ "et msg= "+buf._msg);
                            this.Invoke(this.receptMessageRecu, new object[] { buf.destinataire, buf.sender , buf.message });
                        } 
                        //Déconnexion du client
                        else if (buf._flag == 3 && buf.message == "deco")
                        {
                            Console.WriteLine("deco");
                            clientbuf._socket.Close();
                            try
                            {
                                ok = false;
                                this.Close();
                            }
                            catch (InvalidOperationException) { }
                        }
                        //Si on reçoit la liste des users et chatrooms
                        else if (buf._flag == 4)
                        {
                            this.Invoke(this.recept, new object[] { buf.obj, buf.liste_room });
                        }
                        //chat
                        else if (buf.flag == 9)
                        {
                            this.Invoke(this.receptActualiseListeUser, new object[] { buf.destinataire, buf.obj });
                        }
                        //chat
                        else if (buf.flag == 10)
                        {
                            //MemoryStream ms = new MemoryStream(buf.image);
                            //Image img = Image.FromStream(ms);
                            //Bitmap monImage = (Bitmap)img;
                            //this.Invoke(this.receptIm, new object[] { monImage });
                        }
                    }
                    catch (SocketException) 
                    { 
                        Console.WriteLine("Erreur Socket");
                        this.Close();
                    }
                    catch (NullReferenceException) { Console.WriteLine("Erreur message null"); }
                }
                Console.WriteLine("adad Stop");
            }
    Elle gère la redirection des messages reçues suivant le flag indiqué(messages qui sont tous envoyés depuis le serveur).

  4. #4
    Invité
    Invité(e)
    Par défaut
    OK.
    Peux-tu me dire maintenant où tu prends la valeur de ta variable "clientbuf"? Je n'arrive pas à trouver où tu l'affectes?

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 11
    Par défaut
    J'initialise mon clientbuf dans le constructeur de mon Form, il est envoyé comme paramètre depuis le 1er Form qui initialise la connexion (le code est plus haut)

    Voici le code qui reçoit le client et le stocke dans clientbuf:

    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
    public Form_Acceuil(Client client,Socket sock)
            {
                InitializeComponent();
                this.clientbuf = client;
                init_Variable();
            }
     
            public void init_Variable()
            {
                liste_client = new List<string>();
                liste_chat = new List<Form_Chat>();
                //Initialisation des delegates
                recept = new receptDelegate(updateList);
                receptMessageRecu = new receptDelegateMsg(afficheMessageRecu);
                receptActualiseListeUser = new receptDelegateActu(actualiseListeUserChan);
                //Thread de réception de messages
                t2 = new Thread(new ThreadStart(ThreadProcess));
                t2.Name = "Reception";
                t2.IsBackground = true;
                t2.Start();
            }
    La socket qui est reçue en même temps est la même que celle présente dans l'objet clientbuf, c'est juste le restant d'un de mes tests pour voir où était le problème..

  6. #6
    Invité
    Invité(e)
    Par défaut
    OK.
    Eh bien je crois que c'est là qu'il y a un soucis : "ThreadProcess" est utilisé pour communiquer depuis le serveur vers un client. Si tu n'utilises pas l'objet client correspondant (le socket que tu as eu avec le "Accept" et que tu as encapsulé avec un Client), eh bien cela ne m'étonne pas que ça fasse ce que tu décris.

    Idéalement, pour être tranquille il faudrait que tu passes à ThreadProcess l'objet de type "Client" que tu as eu avec ton "Accept" pour communiquer avec.

    Car actuellement tu communiques uniquement avec le dernier objet "Client" créé, et c'est pour ça que les autres n'arrivent plus à communiquer.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Communication Serveur- Multi Client via socket
    Par jesuisperdu dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 14/03/2011, 09h37
  2. transférer 40 Koctets via des sockets
    Par lemarquisien dans le forum Web & réseau
    Réponses: 13
    Dernier message: 23/04/2009, 10h13
  3. Gestion de droit via des roles
    Par Tardiff Jean-François dans le forum Débuter
    Réponses: 3
    Dernier message: 15/05/2008, 13h03
  4. problème webapp multi-client Tomcat
    Par helter_skelter dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 18/08/2006, 20h10
  5. probleme de gestion de clients avec des sockets....
    Par ludvo dans le forum Réseau
    Réponses: 6
    Dernier message: 25/09/2003, 12h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo