Skip to content
Snippets Groups Projects
Commit a69cc76d authored by ZIMMERLE NATHAN's avatar ZIMMERLE NATHAN
Browse files

Subscribe & Unsubscribe

parent 9c39b5bf
Branches
Tags
No related merge requests found
......@@ -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);
}
......
......@@ -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)
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment