diff --git a/Chat/annuaireUdp/annuaireUdp/Program.cs b/Chat/annuaireUdp/annuaireUdp/Program.cs
index 3f1796c92b4b4175dfa87cdbac5247e4088c1d95..6cca657df51be05b2927402b4429bb82216d06ad 100644
--- a/Chat/annuaireUdp/annuaireUdp/Program.cs
+++ b/Chat/annuaireUdp/annuaireUdp/Program.cs
@@ -84,7 +84,7 @@ namespace ServeurUdp
                 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));
+                annuaire.Bind(new IPEndPoint(IPAddress.Any, portAnnuaire));
 
                 Console.WriteLine("\nAnnuaire lancé");
                 while (true)
diff --git a/Tron/TronClient/TronClient/ChatMessage.cs b/Tron/TronClient/TronClient/ChatMessage.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a831a30c37e12071c3c1097eb9cfdc0f6a946083
--- /dev/null
+++ b/Tron/TronClient/TronClient/ChatMessage.cs
@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace ClientUdp
+{
+    public enum Commande
+    {
+        POST, GET, HELP, QUIT, STOPSERVEUR, SUBSCRIBE, SUBSCRIBEv2, UNSUBSCRIBE, CREATEROOM, LISTROOMS, SIGNALER, LISTSERVEURS, LAUNCHGAME
+    };
+
+    public enum CommandeType { REQUETE, REPONSE };
+
+    class ChatMessage
+    {
+        public const int bufferSize = 1500;
+        public const int headerSize = 35;
+
+        public Commande commande;               // commande
+        public CommandeType commandeType;       // type (Requête/Réponse)
+        public int dataSize;                    // taille de la donnée
+        public String data;                     // données de la commande
+        public String pseudo;                   // pseudo de l'envoyeur 
+
+        public ChatMessage(Commande commande, CommandeType type, String data, String pseudo)
+        {
+            this.commande = commande;
+            this.commandeType = type;
+            this.dataSize = data.Length;
+            this.data = data;
+            this.pseudo = pseudo;
+        }
+
+        public ChatMessage(byte[] buffer)
+        {
+            commande = (Commande)buffer[0];
+            commandeType = (CommandeType)buffer[1];
+            pseudo = Encoding.ASCII.GetString(buffer, 2, 30).TrimEnd(new char[] { '\0' });
+            dataSize = BitConverter.ToInt32(buffer, 32);
+            data = Encoding.ASCII.GetString(buffer, 36, dataSize);
+        }
+
+        public byte[] GetBytes()
+        {
+            byte[] buffer = new byte[bufferSize];                           // Déclaration du buffer
+
+            buffer[0] = (byte)commande;                                     // Commande
+            buffer[1] = (byte)commandeType;                                 // Type de la commande
+            Encoding.ASCII.GetBytes(pseudo, 0, pseudo.Length, buffer, 2);   // Pseudo à 30 bits
+            byte[] intBuf = BitConverter.GetBytes(dataSize);                // Taille de la data
+            buffer[32] = intBuf[0];                                         // Int stocké sur 4bits
+            buffer[33] = intBuf[1];
+            buffer[34] = intBuf[2];
+            buffer[35] = intBuf[3];
+            Encoding.ASCII.GetBytes(data, 0, data.Length, buffer, 36);      // Data
+
+            return buffer;
+        }
+
+        public static byte[] GetBytes(Commande commande, CommandeType type, String data, String pseudo)
+        {
+            ChatMessage chatCommande = new ChatMessage(commande, type, data, pseudo);
+            return chatCommande.GetBytes();
+        }
+
+        public override string ToString()
+        {
+            return "[" + commande + "," + commandeType + ",\"" + pseudo + "\"," + dataSize + ",\"" + data + "\"]";
+        }
+
+    }
+}
diff --git a/Tron/TronClient/TronClient/ClientUdp.cs b/Tron/TronClient/TronClient/ClientUdp.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d3de6e5b6c014857b65e1dc4881c241f7291eff8
--- /dev/null
+++ b/Tron/TronClient/TronClient/ClientUdp.cs
@@ -0,0 +1,320 @@
+using System;
+using System.Net;
+using System.Net.Sockets;
+using System.IO;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+namespace ClientUdp
+{
+    class ClientUdp
+    {
+        const int MsgsBufferSize = 100000000;
+        static string serverIP = "127.0.0.1";    // A changer
+        static int serverPort = 17021;       // A changer
+        static string currentRoom = "Menu principal";
+        static string messages = "";
+        static volatile bool threadIsRunning;
+        static bool isSuscriber = false;
+        static bool createRoom = false;
+
+        // Création du EndPoint serveur
+        static EndPoint serverEP;
+
+        // Création de la socket d'écoute UDP
+        static Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
+        static string getName(string HardName)
+        {
+            String name = String.Empty;
+            bool nameValide = true;
+            while (nameValide)
+            {
+                // Lecture pseudo au clavier
+                Console.Write(HardName + " : ");
+                name = Console.ReadLine();
+                if (name.Length > 30) //on vérifie que le pseudo/nom de la room ne fasse pas plus de 30 caractères, taille fixe définie dans la classe ChatMessage
+                {
+                    Console.WriteLine("Le " + HardName + " est trop long");
+                }
+                else
+                {
+                    nameValide = false;
+                }
+            }
+            return name;
+        }
+        static string getMessage()
+        {
+            String msg = String.Empty;
+            bool messageValide = true;
+            while (messageValide)
+            {
+                // Lecture du message au clavier
+                Console.Write("Message : ");
+                msg = Console.ReadLine();
+                if (msg.Length > ChatMessage.bufferSize - ChatMessage.headerSize)  //on vérifie que le message ne dépassera pas la taille du buffer
+                {
+                    Console.WriteLine("Le message est trop long");
+                }
+                else
+                {
+                    messageValide = false;
+                }
+            }
+            return msg;
+        }
+        static void receiveMsgs()
+        {
+            do
+            {
+                Object o = receive(MsgsBufferSize);
+                if (o is ChatMessage)
+                {
+                    TronClient.Program.LaunchTron();
+                }
+                else
+                {
+                    messages = o.ToString();
+                    displayMsgs();
+                    displayMenu();
+                }               
+            }
+            while (threadIsRunning);
+        }
+
+        static Object receive(int size)
+        {
+            // Création du buffer qui va réceptionner les infos
+            byte[] bufferGet = new byte[size];
+            // Réception des infos
+            int nBytes = clientSocket.ReceiveFrom(bufferGet, bufferGet.Length, SocketFlags.None, ref serverEP);
+            try
+            {
+                return Encoding.ASCII.GetString(bufferGet, 0, nBytes);
+            }
+            catch
+            {
+                return new ChatMessage(bufferGet);
+            }
+
+            
+        }
+
+        static void displayMsgs()
+        {
+            string[] listMessages = messages.Split('/');
+            // Affichage des messages 
+            Console.Clear();
+            Console.WriteLine("======== " + currentRoom + " ========");
+            Console.WriteLine("");
+            foreach (string mess in listMessages)
+            {
+                Console.WriteLine(mess);
+            }
+        }
+
+        static void displayMenu()
+        {
+            // Affichage du menu
+            if (createRoom)
+            {
+                Console.WriteLine("1. Envoyer un message");
+                Console.WriteLine("2. Demander messages");
+                Console.WriteLine("3. S'abonner");
+                Console.WriteLine("4. Se désabonner");
+                Console.WriteLine("5. Créer une room");
+                Console.WriteLine("6. Lister les rooms");
+                Console.WriteLine("7. Lister les serveurs");
+                Console.WriteLine("8. Lancer Tron");
+                Console.Write("Votre choix : ");
+            }
+            else//si pas de room créée
+            {
+                Console.WriteLine("1. Créer une room");
+                Console.Write("Votre choix : ");
+            }
+
+        }
+
+        static void Main(string[] args)
+        {
+            try
+            {
+                //************************************************************** Initialisation
+                bool continuer = true;
+                //connexion au serveur
+                serverEP = new IPEndPoint(IPAddress.Parse(serverIP), serverPort);
+                // Liaison de la socket au point de communication
+                clientSocket.Bind(new IPEndPoint(IPAddress.Any, 58600));
+                //************************************************************** Communications
+                while (continuer)
+                {
+                    // Affichage des messages
+                    Thread.Sleep(500);
+                    displayMsgs();
+                    displayMenu();
+
+                    string choice = Console.ReadLine();//lecture du choix
+                    if (!createRoom && choice == "1")
+                    {
+                        choice = "5";
+                    }
+
+                    // Traitement du choix du menu
+
+                    switch (choice)
+                    {
+                        case "1": // Si envoi message
+                            // Appel de la fonction qui renvoie le pseudo lu au clavier avec les vérifications nécessaires
+                            string pseudo = getName("Pseudo");
+                            // Appel de la fonction qui renvoie le message lu au clavier avec les vérifications nécessaires
+                            string msg = getMessage();
+                            // Création du message en POST de type REQUETE avec le message entré au clavier plus le pseudo entré également au clavier
+                            ChatMessage chat_message = new ChatMessage(Commande.POST, CommandeType.REQUETE, msg, pseudo);
+
+                            // Encodage string dans un buffer de bytes en ASCII
+                            // Transformation des messages en Bytes et placer dans les différents buffer
+                            byte[] buffer = chat_message.GetBytes();
+
+                            // Envoi du message POST au serveur
+                            clientSocket.SendTo(buffer, 0, buffer.Length, SocketFlags.None, serverEP);
+                            Console.WriteLine("Message envoyé");
+                            Thread.Sleep(500);
+                            break;
+                        case "2": // Si requête GET
+
+                            if (!isSuscriber)
+                            {
+                                // Création requête GET
+                                ChatMessage get_msg = new ChatMessage(Commande.GET, CommandeType.REQUETE, "", "");
+                                byte[] bufferGet = get_msg.GetBytes();
+
+                                // Envoi requête
+                                clientSocket.SendTo(bufferGet, 0, bufferGet.Length, SocketFlags.None, serverEP);
+
+                                // Réception messages
+                                receiveMsgs();
+                            }
+                            break;
+
+                        case "3": // Si abonnement
+                            if (!isSuscriber)
+                            {
+                                // Création de la demande d'abonnement et du buffer associé
+                                ChatMessage chat_subscribe = new ChatMessage(Commande.SUBSCRIBE, CommandeType.REQUETE, "", "");
+                                byte[] bufferSubscr = chat_subscribe.GetBytes();
+
+                                // Envoi de la demande d'abonnement
+                                clientSocket.SendTo(bufferSubscr, 0, bufferSubscr.Length, SocketFlags.None, serverEP);
+
+                                // Création du thread
+                                Thread t = new Thread(new ThreadStart(receiveMsgs));
+                                t.Start();
+                                isSuscriber = true;
+                                threadIsRunning = true;
+                                Console.WriteLine("Vous êtes abonné");
+                                Thread.Sleep(500);
+                            }
+
+                            break;
+
+
+                        case "4": // Si désabonnement
+                            // Arrêt du thread
+                            threadIsRunning = false;
+
+                            // Création de la demande de désabonnement et du buffer associé
+                            ChatMessage chat_unsubscribe = new ChatMessage(Commande.UNSUBSCRIBE, CommandeType.REQUETE, "", "");
+                            byte[] bufferUnsub = chat_unsubscribe.GetBytes();
+
+                            // Envoi de la demande d'abonnement
+                            clientSocket.SendTo(bufferUnsub, 0, bufferUnsub.Length, SocketFlags.None, serverEP);
+                            isSuscriber = false;
+                            Console.WriteLine("Désabonnement réussi");
+                            Thread.Sleep(500);
+                            break;
+
+                        case "5": // Si création d'une room
+
+                            createRoom = true;
+
+                            // Appel de la fonction qui renvoie le nom de la room lu au clavier avec les vérifications nécessaires
+                            string nameRoom = getName("Nom de la room");
+
+
+                            // Envoi CREATEROOM au serveur
+                            ChatMessage chat_nameRoom = new ChatMessage(Commande.CREATEROOM, CommandeType.REQUETE, nameRoom, "");
+                            byte[] buffer_room = chat_nameRoom.GetBytes();
+                            clientSocket.SendTo(buffer_room, 0, buffer_room.Length, SocketFlags.None, serverEP);
+
+                            //connexion à la room
+                            byte[] buf = new byte[MsgsBufferSize];
+                            int nBytes = clientSocket.ReceiveFrom(buf, buf.Length, SocketFlags.None, ref serverEP);
+                            int port = int.Parse(Encoding.ASCII.GetString(buf, 0, nBytes));
+
+                            //on lie mnt le client sur la socket de la room qu'il vient de créer
+                            serverEP = new IPEndPoint(IPAddress.Parse(serverIP), port);
+                            Console.WriteLine("Connexion à la room...");
+                            currentRoom = nameRoom;
+                            Thread.Sleep(1000);
+
+                            break;
+
+                        case "6": // si demande de lister les rooms
+
+                            ChatMessage get_rooms = new ChatMessage(Commande.LISTROOMS, CommandeType.REQUETE, "", "");
+                            byte[] bufferGetRooms = get_rooms.GetBytes();
+
+                            // Envoi LISTROOMS au serveur
+                            clientSocket.SendTo(bufferGetRooms, 0, bufferGetRooms.Length, SocketFlags.None, serverEP);
+
+                            if (!isSuscriber)
+                            {
+                                messages = receive(MsgsBufferSize).ToString();
+                            }
+                            break;
+
+                        case "7": // si demande de lister les serveurs
+                            ChatMessage get_servers = new ChatMessage(Commande.LISTSERVEURS, CommandeType.REQUETE, "", "");
+                            byte[] bufferGetServers = get_servers.GetBytes();
+
+                            serverEP = new IPEndPoint(IPAddress.Parse(serverIP), 17020);//appel à l'annuaire pour récupérer la liste
+
+                            // Envoi LISTSERVEURS au serveur
+                            clientSocket.SendTo(bufferGetServers, 0, bufferGetServers.Length, SocketFlags.None, serverEP);
+
+                            // Réception des serveurs
+                            receiveMsgs();
+                            break;
+
+                        case "8": // si on veut lancer Tron
+                            ChatMessage msg_game = new ChatMessage(Commande.LAUNCHGAME, CommandeType.REQUETE, "", "");
+                            byte[] bufferGame = msg_game.GetBytes();
+
+                            serverEP = new IPEndPoint(IPAddress.Parse(serverIP), 17020);//appel à l'annuaire pour récupérer la liste
+
+                            // Envoi LISTSERVEURS au serveur
+                            clientSocket.SendTo(bufferGame, 0, bufferGame.Length, SocketFlags.None, serverEP);
+                            break;
+
+                        default: // Si mauvaise entrée
+                            Console.WriteLine("Veuillez entrer un choix valide !");
+                            Thread.Sleep(2000);
+                            break;
+                    }
+                }
+                //************************************************************** Conclusion
+                // Fermeture socket
+                Console.WriteLine("Fermeture Socket...");
+                clientSocket.Close();
+            }
+            catch (SocketException E)
+            {
+                Console.WriteLine(E.Message);
+                Console.ReadKey();
+            }
+            Console.ReadKey();
+        }
+    }
+}
\ No newline at end of file
diff --git a/Tron/TronClient/TronClient/Program.cs b/Tron/TronClient/TronClient/Program.cs
index 17b0769a8c8b44a3348100edf23beb6b42fbb52a..965197e2bc5fabd3f737f7139b77d65f28de8a08 100644
--- a/Tron/TronClient/TronClient/Program.cs
+++ b/Tron/TronClient/TronClient/Program.cs
@@ -12,7 +12,7 @@ namespace TronClient
         /// </summary>
         //[STAThread]
 
-        static void Main()
+        public static void LaunchTron()
         {
             Application.EnableVisualStyles();
             Application.SetCompatibleTextRenderingDefault(false);
diff --git a/Tron/TronServeur/TronServeur/ChatMessage.cs b/Tron/TronServeur/TronServeur/ChatMessage.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a831a30c37e12071c3c1097eb9cfdc0f6a946083
--- /dev/null
+++ b/Tron/TronServeur/TronServeur/ChatMessage.cs
@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace ClientUdp
+{
+    public enum Commande
+    {
+        POST, GET, HELP, QUIT, STOPSERVEUR, SUBSCRIBE, SUBSCRIBEv2, UNSUBSCRIBE, CREATEROOM, LISTROOMS, SIGNALER, LISTSERVEURS, LAUNCHGAME
+    };
+
+    public enum CommandeType { REQUETE, REPONSE };
+
+    class ChatMessage
+    {
+        public const int bufferSize = 1500;
+        public const int headerSize = 35;
+
+        public Commande commande;               // commande
+        public CommandeType commandeType;       // type (Requête/Réponse)
+        public int dataSize;                    // taille de la donnée
+        public String data;                     // données de la commande
+        public String pseudo;                   // pseudo de l'envoyeur 
+
+        public ChatMessage(Commande commande, CommandeType type, String data, String pseudo)
+        {
+            this.commande = commande;
+            this.commandeType = type;
+            this.dataSize = data.Length;
+            this.data = data;
+            this.pseudo = pseudo;
+        }
+
+        public ChatMessage(byte[] buffer)
+        {
+            commande = (Commande)buffer[0];
+            commandeType = (CommandeType)buffer[1];
+            pseudo = Encoding.ASCII.GetString(buffer, 2, 30).TrimEnd(new char[] { '\0' });
+            dataSize = BitConverter.ToInt32(buffer, 32);
+            data = Encoding.ASCII.GetString(buffer, 36, dataSize);
+        }
+
+        public byte[] GetBytes()
+        {
+            byte[] buffer = new byte[bufferSize];                           // Déclaration du buffer
+
+            buffer[0] = (byte)commande;                                     // Commande
+            buffer[1] = (byte)commandeType;                                 // Type de la commande
+            Encoding.ASCII.GetBytes(pseudo, 0, pseudo.Length, buffer, 2);   // Pseudo à 30 bits
+            byte[] intBuf = BitConverter.GetBytes(dataSize);                // Taille de la data
+            buffer[32] = intBuf[0];                                         // Int stocké sur 4bits
+            buffer[33] = intBuf[1];
+            buffer[34] = intBuf[2];
+            buffer[35] = intBuf[3];
+            Encoding.ASCII.GetBytes(data, 0, data.Length, buffer, 36);      // Data
+
+            return buffer;
+        }
+
+        public static byte[] GetBytes(Commande commande, CommandeType type, String data, String pseudo)
+        {
+            ChatMessage chatCommande = new ChatMessage(commande, type, data, pseudo);
+            return chatCommande.GetBytes();
+        }
+
+        public override string ToString()
+        {
+            return "[" + commande + "," + commandeType + ",\"" + pseudo + "\"," + dataSize + ",\"" + data + "\"]";
+        }
+
+    }
+}
diff --git a/Tron/TronServeur/TronServeur/Program.cs b/Tron/TronServeur/TronServeur/Program.cs
index e92b8e9312e6c502fd150442a821a71cc213b653..f7d8fedef2d2858f22e71377aca9ca5932b66b96 100644
--- a/Tron/TronServeur/TronServeur/Program.cs
+++ b/Tron/TronServeur/TronServeur/Program.cs
@@ -11,10 +11,10 @@ namespace TronServeur
 {
     class Program
     {
-        static void Main(string[] args)
+        public static void LaunchTron(byte n)
         {
             Tron.Tron myTron;            // Moteur du jeu
-            byte nJoueurs = 3;      // Nombre de joueurs
+            byte nJoueurs = n;      // Nombre de joueurs
             byte frequence = 4;    // Temps du tour de jeu (en dixieme de s)
             byte taille = 60;       // Taille du terrain
     
diff --git a/Tron/TronServeur/TronServeur/ServeurUdp.cs b/Tron/TronServeur/TronServeur/ServeurUdp.cs
new file mode 100644
index 0000000000000000000000000000000000000000..80b47a85bf216cb3290c9ae3bab6adf6044b31a2
--- /dev/null
+++ b/Tron/TronServeur/TronServeur/ServeurUdp.cs
@@ -0,0 +1,292 @@
+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 ServeurUdp
+    {
+        const int MsgsBufferSize = 100000000;
+        string messages = String.Empty;
+        string server = String.Empty;
+        List<EndPoint> subscribers = new List<EndPoint>();
+        List<EndPoint> alreadyConnectedRoom = new List<EndPoint>();
+        string nameRoom = string.Empty;
+        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
+        static int portAnnuaire = 17020;
+        static string ipAnnuaire = "130.79.81.203";
+
+        void sendMsgs(Socket serverSocket, EndPoint clientEP)
+        {
+            // Pas de message sur le serveur on l'indique au client
+            if (messages == String.Empty)
+            {
+                byte[] buf = Encoding.ASCII.GetBytes("Il n'y a aucun message d'enregistré sur le serveur !");
+                serverSocket.SendTo(buf, 0, buf.Length, SocketFlags.None, clientEP);
+            }
+            // Envoi des messages au client
+            else
+            {
+                byte[] buf = System.Text.Encoding.ASCII.GetBytes(messages);
+                serverSocket.SendTo(buf, 0, buf.Length, SocketFlags.None, clientEP);
+            }
+            Console.WriteLine("Liste des messages envoyée !");
+        }
+
+        //pour chaque abonné on envoie les messages
+        void updateSubscribers(Socket serverSocket)
+        {
+            foreach (EndPoint ep in subscribers)
+            {
+                sendMsgs(serverSocket, ep);
+            }
+        }
+
+        //on regarde si un client est abonné
+        bool isSubscriber(EndPoint ep)
+        {
+            bool res = false;
+            for (int i = 0; i < subscribers.Count && !res; i++)
+            {
+                if (subscribers.ElementAt(i).ToString() == ep.ToString())
+                {
+                    res = true;
+                }
+            }
+            return res;
+        }
+
+        //on regarde si le client est déjà connecté à une room
+        bool isConnectedToRoom(EndPoint ep)
+        {
+            bool res = false;
+            foreach (EndPoint client in alreadyConnectedRoom)
+            {
+                if (client.ToString() == ep.ToString())
+                {
+                    res = true;
+                }
+            }
+            return res;
+        }
+
+        //création de la chat room
+        static void createChat(string nameRoom, Socket serverSocket)
+        {
+            ServeurUdp chatServer = new ServeurUdp();
+
+            //création de la nouvelle socket pour la chat room
+            numPort++;
+            string[] args = { numPort.ToString(), nameRoom };//envoi du numéro de port pour la chat room (sera à chaque fois incrémenté)
+
+            //création et lancement du Thread qui contiendra le MainServer
+            Thread chatServerThread = new System.Threading.Thread(() => chatServer.MainServer(args));
+            chatServerThread.Start();
+        }
+
+        public static void Main(string[] args)
+        {
+            //Serveur 
+            ServeurUdp server = new ServeurUdp();
+
+            //on place le numéro du serveur de base en dur
+            string[] arg = { 17021.ToString() };
+            server.MainServer(arg);
+        }
+
+        public void MainServer(string[] args)
+        {
+            try
+            {
+                // ************************************************************** Initialisation
+
+                // Création de la socket d'écoute UDP / socket pour chaque chat room
+                Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
+
+                // Liaison de la socket au point de communication
+                int num_port = int.Parse(args[0]);//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));
+
+                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
+                    string nameRoom = args[1];
+                    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
+
+                while (continuer)
+                {
+                    Console.WriteLine("\n************************ Attente d'un nouveau message ************************");
+                    if (!display)
+                    {
+                        Console.WriteLine("numéro de port du serveur de base : " + serverSocket.LocalEndPoint);
+                        display = true;
+                    }
+                    else
+                    {
+                        Console.WriteLine("numéro de port de la chat room : " + serverSocket.LocalEndPoint);
+                    }
+
+                    // Reception message client
+                    EndPoint clientEP = new IPEndPoint(IPAddress.Any, 0);
+                    byte[] buffer = new byte[ChatMessage.bufferSize];
+                    serverSocket.ReceiveFrom(buffer, buffer.Length, SocketFlags.None, ref clientEP);
+
+                    // Message instancié à partir du buffer
+                    ChatMessage msg = new ChatMessage(buffer);
+
+                    // Traitement par commande
+                    switch (msg.commande)
+                    {
+                        // Si envoi de message
+                        case Commande.POST:
+                            messages += msg.pseudo + ':' + msg.data + '/';
+                            Console.WriteLine(msg.ToString());
+                            updateSubscribers(serverSocket);
+                            break;
+
+                        // Si demande des messages du serveur
+                        case Commande.GET:
+                            Console.WriteLine("Envoi des messages GET");
+                            sendMsgs(serverSocket, clientEP);
+                            break;
+
+                        // Si demande d'abonnement aux messages
+                        case Commande.SUBSCRIBE:
+                            Console.WriteLine("Demande d'abonnement...");
+                            if (!isSubscriber(clientEP))
+                            {
+                                Console.WriteLine("Un client s'est abonné");
+                                subscribers.Add(clientEP);
+                            }
+                            else
+                            {
+                                Console.WriteLine("Le client est déjà abonné");
+                            }
+                            updateSubscribers(serverSocket);
+                            break;
+
+                        // Si demande de désabonnement
+                        case Commande.UNSUBSCRIBE:
+                            Console.WriteLine("Demande de désabonnement...");
+                            if (isSubscriber(clientEP))
+                            {
+                                Console.WriteLine("Un client s'est désabonné");
+                                sendMsgs(serverSocket, clientEP); // Pour débloquer le client afin qu'il termine son thread
+                                subscribers.Remove(clientEP);
+                            }
+                            else
+                            {
+                                Console.WriteLine("Le client n'est pas abonné");
+                            }
+                            break;
+
+                        case Commande.CREATEROOM://création d'une room 
+
+                            Console.WriteLine("Demande de création d'une room...");
+                            Console.WriteLine("Un client a créé la room : " + msg.data + " et y a été automatiquement ajouté");
+                            //création de la chat room
+                            nameRoom = msg.data;
+                            createChat(msg.data, serverSocket);
+
+                            //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());
+                            serverSocket.SendTo(buf, 0, buf.Length, SocketFlags.None, clientEP);
+
+                            break;
+
+                        case Commande.LISTROOMS: // retourne toutes les rooms créées 
+
+                            Console.WriteLine("Demande de lister les rooms...");
+
+                            //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[MsgsBufferSize];
+                            int nBytes = serverSocket.ReceiveFrom(buff, buff.Length, SocketFlags.None, ref annuairee);
+
+                            string rooms = Encoding.ASCII.GetString(buff, 0, nBytes);
+
+                            //envoie au client
+                            byte[] buf_room = Encoding.ASCII.GetBytes(rooms);
+                            serverSocket.SendTo(buf_room, 0, buf_room.Length, SocketFlags.None, clientEP);
+
+                            break;
+
+                        // on va rechercher dans l'annuaire 
+                        case Commande.LISTSERVEURS:
+                            Console.WriteLine("Demande de lister les serveurs...");
+
+                            //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);
+                            string servers = Encoding.ASCII.GetString(buf_annuaire, 0, nbBytes);
+
+                            //envoie au client
+                            byte[] buf_ann = Encoding.ASCII.GetBytes(servers);
+                            serverSocket.SendTo(buf_ann, 0, buf_ann.Length, SocketFlags.None, clientEP);
+
+                            break;
+
+                        // Lancement de Tron
+                        case Commande.LAUNCHGAME:
+                            Console.WriteLine("Lancement de Tron...");
+                            TronServeur.Program.LaunchTron((byte) subscribers.Count);
+
+                            foreach (EndPoint ep in subscribers)
+                            {
+                                ChatMessage msg_launch = new ChatMessage(Commande.LAUNCHGAME, CommandeType.REPONSE, "", "");
+                                byte[] bufferLaunch = msg_launch.GetBytes();
+                                serverSocket.SendTo(bufferLaunch, 0, bufferLaunch.Length, SocketFlags.None, ep);
+                            }
+
+                            break;
+                    }
+                }
+                // Fermeture socket
+                Console.WriteLine("Fermeture Socket...");
+                serverSocket.Close();
+                //************************************************************** Conclusion
+            }
+            catch (SocketException E)
+            {
+                Console.WriteLine(E.Message);
+                Console.ReadKey();
+            }
+            Console.ReadKey();
+        }
+    }
+}
\ No newline at end of file