Bonjour,
Je programme actuellement un serveur. Puisque il est prévu pour accueillir un assez grand nombre de client, il n'est pas envisageable de créer un thread par client.
Je suis donc parti sur une architecture "custom" où j'ai plusieurs thread qui servent à gérer la (dé)connection/L'envoi/Reception et le traitement de données. Voici mes variables (c'est surement pas l'organisation parfaite mais c'est un premier jet que j'améliorerais au fil du temps).
Les fonctions liées à ces threads sont donc :
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 #region Variables #region Threads //Thread to handle connections static Thread ConnectThread; //Threads To recieve messages static Thread ReadThread, WriteThread; //Thread to handle Message static Thread HandleThread; // Thread To disconnect clients when it's needed static Thread DisconnectThread; #endregion #region Data public static List<Client> Clients = new List<Client>(); static Queue<PacketStream> DataToSend = new Queue<PacketStream>(); static Queue<Packet> DataToHandle = new Queue<Packet>(); public static bool IsClientsAvailable = true; static bool IsDataToSendAvailable = true; static bool IsDataToHandleAvailable = true; #endregion #endregion
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public static void Initialize(); public static void Connect(); private static void Read(); private static void Write(); private static void Handle();
Mon problème est le suivant : Quand un client veux se connecter au serveur
Il se fait Accepter par le serveur dans Connect par ConnectThread;
Il envoie un paquet de connexion qui sera lu par read.
Ce paquet doit être traité par handle. Un paquet de réponse est crée. Cependant pour ajouter le client, et envoyer le paquet de réponse, je dois avoir accès au NetworkStream lié à mon client. Problème ? Je n'y ais eu accès que dans mon Connect() avec tcpListener.AcceptTcpClient().GetStream(). Mais a ce moment la le client ne m'a envoyé aucun paquet, donc je n'ai (à priori) aucun moyen de l'identifier. Or, je ne peux pas me permettre de faire une fonction bloquante qui attende le paquet de connexion, puisque tout les clients qui se connectent sont sur la même file d'attente. Du coup, une fois dans mon handle(), je ne sais pas du tout comment récupérer cette donnée.
Quelqu'un aurait il des idées pour récupérer des données ou contourner ce problème? Mon architecture tient elle plus où moins la route ?
Si des points ne sont pas très clairs, posez moi des questions, j'expliquerais plus en détail.
Merci d'avance pour votre aide
Partager