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