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:
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:
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:
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:
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!