Bonjour,
Je suis sur un projet de Chat Serveur/Client.
Mon serveur est fait de tel sorte:
L'initialisation du serveur:
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 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);
A chaque fois qu'un client se connecte, je stocke le socket via une liste de 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 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é.
La classe Client contient le nom d'un client le socket qui le lie au serveur.
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;
Et voici la fonction permettant d'envoyer des messages:
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é...)
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));
Merci d'avance!
Partager