From 25caec40db80c0677e238e9b3e3209820b088ecb Mon Sep 17 00:00:00 2001 From: OPALVENS Florence <fopalvens@ad.unistra.fr> Date: Tue, 3 Jan 2017 12:42:16 +0100 Subject: [PATCH] annuaire --- Chat/serveurUdp/serveurUdp/Annuaire.cs | 90 ++++++++++++++++++++++++ Chat/serveurUdp/serveurUdp/ServeurUdp.cs | 70 +++++++++++------- 2 files changed, 136 insertions(+), 24 deletions(-) create mode 100644 Chat/serveurUdp/serveurUdp/Annuaire.cs diff --git a/Chat/serveurUdp/serveurUdp/Annuaire.cs b/Chat/serveurUdp/serveurUdp/Annuaire.cs new file mode 100644 index 0000000..280e457 --- /dev/null +++ b/Chat/serveurUdp/serveurUdp/Annuaire.cs @@ -0,0 +1,90 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.IO; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ClientUdp; +using System.Threading; + + +namespace ServeurUdp +{ + class Annuaire + { + const int MsgsBufferSize = 100000000; + string messages = String.Empty; + + static Dictionary<int, string> rooms = new Dictionary<int, string>(); + static List<EndPoint> servers = new List<EndPoint>(); + + public static void Main(string[] args) + { + try + { + // ************************************************************** Initialisation + + int portAnnuaire = 17020; + string ipAnnuaire = "127.0.0.1"; + + // Création de la socket d'écoute UDP / socket pour chaque chat room + Socket annuaire = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + + // Liaison de la socket au point de communication + annuaire.Bind(new IPEndPoint(IPAddress.Parse(ipAnnuaire), portAnnuaire)); + + EndPoint serverChatEP = new IPEndPoint(IPAddress.Any, 0); + byte[] buffer = new byte[ChatMessage.bufferSize]; + annuaire.ReceiveFrom(buffer, buffer.Length, SocketFlags.None, ref serverChatEP); + ChatMessage msg = new ChatMessage(buffer); + + switch (msg.commande) + { + //ajout du serveur et de la room créé + case Commande.SIGNALER: + rooms.Add(int.Parse(msg.pseudo), msg.data); + if (!servers.Contains(serverChatEP)) + { + servers.Add(serverChatEP); + } + + break; + + //envoie des serveurs + case Commande.LISTSERVEURS: + byte[] buf = System.Text.Encoding.ASCII.GetBytes(servers.ToString()); + annuaire.SendTo(buf, 0, buf.Length, SocketFlags.None, serverChatEP); + + break; + + //envoie des rooms + case Commande.LISTROOMS: + byte[] buff = System.Text.Encoding.ASCII.GetBytes(rooms.ToString()); + annuaire.SendTo(buffer, 0, buff.Length, SocketFlags.None, serverChatEP); + + break; + } + + + + //************************************************************** Communications + + // Fermeture socket + Console.WriteLine("Fermeture Socket..."); + annuaire.Close(); + + //************************************************************** Conclusion + } + + catch (SocketException E) + { + Console.WriteLine(E.Message); + Console.ReadKey(); + } + + Console.ReadKey(); + } + } +} + diff --git a/Chat/serveurUdp/serveurUdp/ServeurUdp.cs b/Chat/serveurUdp/serveurUdp/ServeurUdp.cs index d374206..9e5aa0d 100644 --- a/Chat/serveurUdp/serveurUdp/ServeurUdp.cs +++ b/Chat/serveurUdp/serveurUdp/ServeurUdp.cs @@ -19,15 +19,14 @@ namespace ServeurUdp List<EndPoint> subscribers = new List<EndPoint>(); List<EndPoint> alreadyConnectedRoom = new List<EndPoint>(); string nameRoom = string.Empty; - static Dictionary<int, string> rooms = new Dictionary<int, string>(); static int numPort = 17021; static bool display = false; + static bool insert = false; + EndPoint annuaire = new IPEndPoint(IPAddress.Parse(ipAnnuaire), portAnnuaire); //éléments de base pour implémenter l'annuaire - List<string> servers = new List<string>();//List<EndPoint> servers = new List<EndPoint>(); ==> A REMPLACER par ce qu'il y a en comm mais prob de cast !!!!!!!! static int portAnnuaire = 17020; static string ipAnnuaire = "127.0.0.1"; - static EndPoint annuaire; void sendMsgs(Socket serverSocket, EndPoint clientEP) { @@ -47,7 +46,7 @@ namespace ServeurUdp } //envoi de toutes les rooms enregistrées sur le serveur - void sendRooms(Socket serverSocket, EndPoint clientEP) + void sendRooms(Socket serverSocket, EndPoint clientEP, Dictionary<int,string> rooms) { //pas de room enregistrée sur le serveur if(rooms.Count == 0) @@ -68,7 +67,7 @@ namespace ServeurUdp Console.WriteLine("Liste des rooms envoyée !"); } - void sendServers(Socket serverSocket, EndPoint clientEP) + void sendServers(Socket serverSocket, EndPoint clientEP, List<EndPoint> servers) { if(servers.Count == 0) { @@ -130,8 +129,7 @@ namespace ServeurUdp //création de la nouvelle socket pour la chat room numPort++; string[] args = { numPort.ToString() };//envoi du numéro de port pour la chat room (sera à chaque fois incrémenté) - //Console.WriteLine(args[0]); - + //création et lancement du Thread qui contiendra le MainServer Thread chatServerThread = new System.Threading.Thread(() => chatServer.MainServer(args)); chatServerThread.Start(); @@ -158,17 +156,21 @@ namespace ServeurUdp // Liaison de la socket au point de communication int num_port = int.Parse(args[0].ToString());//on récupère le numéro de port qui a été incrémenté dans la fonction createChat - serverSocket.Bind(new IPEndPoint(IPAddress.Any, num_port)); - //envoi de la requête signaler à l'annuaire dès qu'on crée un serveur de chat - ChatMessage get_signal = new ChatMessage(Commande.SIGNALER, CommandeType.REQUETE, nameRoom, ""); - byte[] bufferGetSignal = get_signal.GetBytes(); - - annuaire = new IPEndPoint(IPAddress.Parse(ipAnnuaire), portAnnuaire);//on envoit à l'annuaire via son adressIP et son numéro de port 17020 - serverSocket.SendTo(bufferGetSignal, 0, bufferGetSignal.Length, SocketFlags.None, annuaire);//on envoie à l'annuaire pour qu'il stocke le serveur dans sa liste + if (!insert)//on enregistre pas le tout premier serveur lancé + { + insert = true; + } + else + { + //envoi de la requête signaler à l'annuaire dès qu'on crée un serveur de chat + ChatMessage get_signal = new ChatMessage(Commande.SIGNALER, CommandeType.REQUETE, nameRoom, num_port.ToString()); + byte[] bufferGetSignal = get_signal.GetBytes(); - + serverSocket.SendTo(bufferGetSignal, 0, bufferGetSignal.Length, SocketFlags.None, annuaire);//on envoie à l'annuaire pour qu'il stocke le serveur et la room dans sa liste + } + bool continuer = true; //************************************************************** Communications @@ -249,26 +251,46 @@ namespace ServeurUdp //on réenvoie le numéro de port de la chat room pour qu'on puisse connecter le client à celle-ci (permettra aussi les tests de créer une room dans une room) byte[] buf = Encoding.ASCII.GetBytes(numPort.ToString()); - Console.WriteLine(numPort.ToString()); serverSocket.SendTo(buf, 0, buf.Length, SocketFlags.None, clientEP); - rooms.Add(numPort, msg.data);//ajout de la room dans la liste du chat serveur - // servers.Add(server);//ajout du serveur de chat à la liste des serveurs - break; case Commande.LISTROOMS: // retourne toutes les rooms créées Console.WriteLine("Demande de lister les rooms..."); - //envoi des rooms et leur numéro de port - sendRooms(serverSocket, clientEP); - + + //envoie demande à l'annuaire + ChatMessage get_rooms = new ChatMessage(Commande.LISTROOMS, CommandeType.REQUETE, "", ""); + byte[] bufferGetRooms = get_rooms.GetBytes(); + serverSocket.SendTo(bufferGetRooms, 0, bufferGetRooms.Length, SocketFlags.None, annuaire); + + //réception des rooms + EndPoint annuairee = new IPEndPoint(IPAddress.Any, 0); + byte[] buff = new byte[ChatMessage.bufferSize]; + int nBytes = serverSocket.ReceiveFrom(buff, buff.Length, SocketFlags.None, ref annuairee); + Dictionary<int, string> rooms = Encoding.ASCII.GetString(buff, 0, nBytes); + + //envoie au client + sendRooms(serverSocket, clientEP, rooms); + break; //on va rechercher dans l'annuaire case Commande.LISTSERVEURS: Console.WriteLine("Demande de lister les serveurs..."); - Console.WriteLine("Envoi des serveurs"); - sendServers(serverSocket, clientEP); + + //envoie demande à l'annuaire + ChatMessage get_servers = new ChatMessage(Commande.LISTSERVEURS, CommandeType.REQUETE, "", ""); + byte[] bufferGetServers = get_servers.GetBytes(); + serverSocket.SendTo(bufferGetServers, 0, bufferGetServers.Length, SocketFlags.None, annuaire); + + //réception des rooms + EndPoint annu = new IPEndPoint(IPAddress.Any, 0); + byte[] buf_annuaire = new byte[ChatMessage.bufferSize]; + int nbBytes = serverSocket.ReceiveFrom(buf_annuaire, buf_annuaire.Length, SocketFlags.None, ref annu); + List<EndPoint> servers = Encoding.ASCII.GetString(buf_annuaire, 0, nbBytes); + + //envoie au client + sendServers(serverSocket, clientEP, servers); break; } -- GitLab