From a69cc76d99a391e7ecbd898f4f34f39632bfe269 Mon Sep 17 00:00:00 2001 From: Nathan Zimmerle <nathan.zimmerle@etu.unistra.fr> Date: Tue, 27 Dec 2016 14:33:07 +0100 Subject: [PATCH] Subscribe & Unsubscribe --- Chat/clientUdp/clientUdp/ClientUdp.cs | 69 +++++++++--------- Chat/serveurUdp/serveurUdp/ServeurUdp.cs | 89 ++++++++++++++++++++---- 2 files changed, 107 insertions(+), 51 deletions(-) diff --git a/Chat/clientUdp/clientUdp/ClientUdp.cs b/Chat/clientUdp/clientUdp/ClientUdp.cs index 1b28094..06f3a4a 100644 --- a/Chat/clientUdp/clientUdp/ClientUdp.cs +++ b/Chat/clientUdp/clientUdp/ClientUdp.cs @@ -11,7 +11,7 @@ namespace ClientUdp { class ClientUdp { - const int MsgsBufferSize = 1000000; + const int MsgsBufferSize = 100000000; static string getPseudo() { String pseudo = String.Empty; @@ -63,7 +63,7 @@ namespace ClientUdp { //************************************************************** Initialisation - string serverIP = "130.79.81.68"; // A changer + string serverIP = "127.0.0.1"; // A changer int serverPort = 17021; // A changer bool continuer = true; @@ -78,56 +78,49 @@ namespace ClientUdp // Liaison de la socket au point de communication clientSocket.Bind(new IPEndPoint(IPAddress.Any,58600)); - while (continuer) - { - // Création du EndPoint serveur - EndPoint serverEP = new IPEndPoint(IPAddress.Parse(serverIP), serverPort); - - //appel de la fonction qui renvoie le pseudo lu au clavier avec les vérifications nécessaires - string pseudo = getPseudo(); - //appel de la fonction qui renvoie le message lu au clavier avec les vérifications nécessaires - string msg = getMessage(); + // Création du EndPoint serveur + EndPoint serverEP = new IPEndPoint(IPAddress.Parse(serverIP), serverPort); + //************************************************************** Communications + // 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(); - //création du message en POST et en GET 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); - ChatMessage chat_messagePost = new ChatMessage(Commande.GET, CommandeType.REQUETE, "", ""); + // Envoi de la demande d'abonnement + clientSocket.SendTo(bufferSubscr, 0, bufferSubscr.Length, SocketFlags.None, serverEP); - - //************************************************************** Communications - - // Encodage string dans un buffer de bytes en ASCII - //transformation des messages en Bytes et placer dans les différents buffer - //création du buffer qui va réceptionner la liste de messages - byte[] buffer = chat_message.GetBytes(); - byte[] bufferPost = chat_messagePost.GetBytes(); + while (continuer) + { + // création du buffer qui va réceptionner la liste de messages byte[] bufferGet = new byte[MsgsBufferSize]; - - //Console.WriteLine("Taille buffer : " + buffer.Length); - // Envoie du message POST au serveur - clientSocket.SendTo(buffer, 0, buffer.Length, SocketFlags.None, serverEP); - Thread.Sleep(3000); - - // Envoie du message GET au serveur - clientSocket.SendTo(bufferPost, 0, bufferPost.Length, SocketFlags.None, serverEP); //réception de la liste des messages int nBytes = clientSocket.ReceiveFrom(bufferGet, bufferGet.Length, SocketFlags.None, ref serverEP); //désérialisation de la chaîne comportant les messages avec pseudo - string messages = System.Text.Encoding.ASCII.GetString(bufferGet,0, nBytes); + string messages = System.Text.Encoding.ASCII.GetString(bufferGet, 0, nBytes); string[] listMessages = messages.Split('/'); //affichage des messages - foreach(string mess in listMessages) - { + Console.WriteLine(""); + foreach (string mess in listMessages) + { Console.WriteLine(mess); } - - /*Console.WriteLine("Nouveau message envoye vers " - + serverEP - + " (" + nBytes + " octets)" - + ": \"" + msg + "\"");*/ + //appel de la fonction qui renvoie le pseudo lu au clavier avec les vérifications nécessaires + string pseudo = getPseudo(); + //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(); + + // Envoie du message POST au serveur + clientSocket.SendTo(buffer, 0, buffer.Length, SocketFlags.None, serverEP); } diff --git a/Chat/serveurUdp/serveurUdp/ServeurUdp.cs b/Chat/serveurUdp/serveurUdp/ServeurUdp.cs index 4ec6cfb..72e5641 100644 --- a/Chat/serveurUdp/serveurUdp/ServeurUdp.cs +++ b/Chat/serveurUdp/serveurUdp/ServeurUdp.cs @@ -11,6 +11,49 @@ namespace ServeurUdp { class ServeurUdp { + static string messages = String.Empty; + static List<EndPoint> subscribers = new List<EndPoint>(); + + static 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 demandé !"); + } + + static void updateSubscribers(Socket serverSocket) + { + foreach(EndPoint ep in subscribers) + { + sendMsgs(serverSocket, ep); + } + } + + static 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; + } + static void Main(string[] args) { try @@ -28,18 +71,15 @@ namespace ServeurUdp serverSocket.Bind(new IPEndPoint(IPAddress.Any, 17021)); bool continuer = true; - string messages = String.Empty; - + //************************************************************** Communications while (continuer) { - Console.WriteLine("Attente d'une nouveau message..."); + Console.WriteLine("Attente d'un nouveau message..."); // 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 @@ -52,31 +92,54 @@ namespace ServeurUdp case Commande.POST: messages += msg.pseudo + ':' + msg.data + '/'; Console.WriteLine(msg.ToString()); + updateSubscribers(serverSocket); break; + // Si demande des messages du serveur case Commande.GET: - // Pas de message sur le serveur on l'indique au client - if(messages == String.Empty) + 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)) { - byte[] buf = System.Text.Encoding.ASCII.GetBytes("Il n'y a aucun message d'enregistré sur le serveur !"); - serverSocket.SendTo(buf, 0, buf.Length, SocketFlags.None, clientEP); + Console.WriteLine("Un client s'est abonné"); + subscribers.Add(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("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é"); + subscribers.Remove(clientEP); + } + else + { + Console.WriteLine("Le client n'est pas abonné"); + } + break; } - //************************************************************** Conclusion + } // Fermeture socket Console.WriteLine("Fermeture Socket..."); serverSocket.Close(); + + //************************************************************** Conclusion } catch (SocketException E) -- GitLab