Commit fb412cad authored by Timothee WRIGHT's avatar Timothee WRIGHT
Browse files

Mise en place du Threading + factorisation du code pour l'affichage dans la console

parent ba13ac2f
......@@ -5,12 +5,20 @@ using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ClientUdp
{
class ClientUdp
{
static void Main(string[] args)
private static Socket clientSocket;
private static EndPoint serverEP;
public enum ClientStatus{ ENVOI, RECEPTION, STOP };
private static ClientStatus status = ClientStatus.ENVOI;
public static void Main(string[] args)
{
//variable de test des dépassements de mémoire.
String bufferOverflow = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" +
......@@ -38,6 +46,8 @@ namespace ClientUdp
listeTests.Add("testPost2", new object[] { Commande.POST, CommandeType.REQUETE, "Tim", "test post2" });
listeTests.Add("testGet", new object[] { Commande.GET, CommandeType.REQUETE, "Tim", "test get" });
Thread reception = new Thread(new ThreadStart(ReceptionMessage));
try
{
//************************************************************** Initialisation
......@@ -46,7 +56,7 @@ namespace ClientUdp
// Création de la socket d'écoute UDP
Socket clientSocket = new Socket(
clientSocket = new Socket(
//domaine (IPv4)
AddressFamily.InterNetwork,
//type de socket (Dgram = pas de connexions préalable)
......@@ -59,66 +69,124 @@ namespace ClientUdp
// Création du EndPoint serveur
EndPoint serverEP = new IPEndPoint(IPAddress.Parse(serverIP), serverPort);
serverEP = new IPEndPoint(IPAddress.Parse(serverIP), serverPort);
reception.Start();
//envoi des messages
foreach (var element in listeTests)
{
object[] cmdParam = element.Value;
try
if(status != ClientStatus.STOP)
{
Console.WriteLine(" ");
Console.WriteLine("Message "+ element.Key + ":");
ChatMessage chatM = new ChatMessage((Commande)cmdParam[0], (CommandeType)cmdParam[1], (string)cmdParam[2], (string)cmdParam[3]);
// Encodage du string dans un buffer de bytes en ASCII
byte[] buffer = chatM.GetBytes();
Console.WriteLine("Taille buffer : " + buffer.Length);
// Envoie du message au serveur
int nBytes = clientSocket.SendTo(buffer, 0, buffer.Length, SocketFlags.None, serverEP);
Console.WriteLine("Nouveau message (" + element.Key + ") envoye vers "
+ serverEP
+ " (" + nBytes + " octets)"
+ ": \"" + chatM + "\"");
if((Commande)cmdParam[0] == Commande.GET)
object[] cmdParam = element.Value;
try
{
do
{
int nbBytes = clientSocket.ReceiveFrom(buffer, buffer.Length, SocketFlags.None, ref serverEP);
if (nbBytes > 0)
{
ChatMessage chatMsg = new ChatMessage(buffer);
Console.WriteLine("Réponse de "
+ serverEP
+ " (" + nbBytes + " octets)"
+ ": \"" + chatMsg + "\"");
}
} while (nBytes > 0);
ChatMessage chatM = new ChatMessage((Commande)cmdParam[0], (CommandeType)cmdParam[1], (string)cmdParam[2], (string)cmdParam[3]);
// Encodage du string dans un buffer de bytes en ASCII
byte[] buffer = chatM.GetBytes();
// Envoie du message au serveur
int nBytes = clientSocket.SendTo(buffer, 0, buffer.Length, SocketFlags.None, serverEP);
PrintEnvoiMessage(chatM, element.Key, nBytes);
}
catch (ArgumentOutOfRangeException ex)
{
Console.WriteLine("");
Console.WriteLine("Erreur: " + ex.Message);
}
}
catch(ArgumentOutOfRangeException ex)
else
{
Console.WriteLine("Erreur: "+ex.Message);
break;
}
}
//************************************************************** Conclusion
// Fermeture socket
Console.WriteLine("Fermeture Socket...");
clientSocket.Close();
Console.WriteLine("Appuyez sur une touche pour quitter...");
Console.ReadKey();
}
catch (SocketException E)
{
Console.WriteLine(E.Message);
Console.ReadKey();
}
finally
{//En cas d'erreur ou à la fin, on ferme la socket et on arrete le thread de reception
reception.Abort();
Console.WriteLine("");
Console.WriteLine("Fermeture Socket");
clientSocket.Close();
}
}
public static void ReceptionMessage()
{
byte[] buffer = new byte[ChatMessage.bufferSize];
while (status != ClientStatus.STOP)
{
try
{
//On récupère le packet et on traite le message
int nBytes = clientSocket.ReceiveFrom(buffer, ChatMessage.bufferSize, SocketFlags.None, ref serverEP);
ChatMessage msg = new ChatMessage(buffer);
switch (msg.commande)
{
case Commande.POST:
break;
case Commande.GET:
PrintReceptionMessage(msg, nBytes);
break;
case Commande.HELP:
break;
case Commande.QUIT:
break;
case Commande.STOPSERVEUR:
PrintReceptionMessage(msg, nBytes);
status = ClientStatus.STOP;
break;
case Commande.SUBSCRIBE:
PrintReceptionMessage(msg, nBytes);
break;
case Commande.SUBSCRIBEv2:
break;
case Commande.UNSUBSCRIBE:
break;
}
}
catch (SocketException E)
{
Console.WriteLine(E.Message);
status = ClientStatus.STOP;
}
}
}
Console.ReadKey();
public static void PrintEnvoiMessage(ChatMessage c, string nomMessage, int nBytes)
{
PrintMessage(c, "(" + nomMessage + ") ", "envoye vers ", nBytes);
}
public static void PrintReceptionMessage(ChatMessage c, int nBytes)
{
PrintMessage(c, "reçu de ", nBytes);
}
public static void PrintMessage(ChatMessage c, string action, int nBytes)
{
PrintMessage(c, "", action, nBytes);
}
public static void PrintMessage(ChatMessage c, string nomMessage, string action, int nBytes)
{
Console.WriteLine("");
Console.Write("Nouveau message " + nomMessage);
Console.ForegroundColor = ConsoleColor.Green;
Console.Write(action);
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(serverEP
+ " (" + nBytes + " octets)"
+ ": \"" + c + "\"");
}
}
}
No preview for this file type
No preview for this file type
fdeec79cfeb86d26fb4bc67c02d6b09c19963797
948af7afcba4d65fd1ae374c76218bf680ca1164
No preview for this file type
No preview for this file type
......@@ -42,6 +42,7 @@ namespace ServeurUdp
while (run)
{
//************************************************************** Communications
Console.WriteLine("");
Console.WriteLine("Attente d'une nouveau message...");
// Reception message client
......@@ -94,58 +95,65 @@ namespace ServeurUdp
break;
}
}
// Fermeture socket
Console.WriteLine("Fermeture Socket...");
serverSocket.Close();
Console.WriteLine("Appuyez sur une touche pour quitter...");
Console.ReadKey();
}
catch (SocketException E)
{
Console.WriteLine(E.Message);
}
finally
{//En cas d'erreur ou à la fin, on ferme la socket et on arrete le thread de reception
Console.WriteLine("");
Console.WriteLine("Fermeture Socket");
serverSocket.Close();
}
}
public static void StockerMessage(ChatMessage c)
{
listeMessages.Add(c);
Console.WriteLine("Le message '" + c.ToString() + "a été stocké");
foreach (KeyValuePair<EndPoint, String> abonne in listeAbonnes)
{
serverSocket.SendTo(ChatMessage.GetBytes(Commande.SUBSCRIBE, CommandeType.REPONSE, c.pseudo, c.data), abonne.Key);
}
foreach (KeyValuePair<EndPoint, String> abonne in listeAbonnes)
{
serverSocket.SendTo(ChatMessage.GetBytes(Commande.SUBSCRIBE, CommandeType.REPONSE, c.pseudo, c.data), abonne.Key);
}
}
public static void RecevoirMessage(ChatMessage c)
{
foreach (ChatMessage message in listeMessages)
{
{
serverSocket.SendTo(ChatMessage.GetBytes(Commande.GET, CommandeType.REPONSE, message.pseudo, message.data), clientEP);
}
}
}
public static void SubscribeClient(ChatMessage c,EndPoint ep)
{
if (!listeAbonnes.ContainsKey(ep))
{
listeAbonnes.Add(ep, c.pseudo);
Console.WriteLine(c.pseudo+" vient de s'abonner");
}
else
Console.WriteLine("Le client est déjà enregistré pour recevoir les messages");
}
public static void UnsubscribeClient(ChatMessage c, EndPoint clientEP)
{
if (listeAbonnes.ContainsKey(clientEP))
{
listeAbonnes.Remove(clientEP);
}
else
{
Console.WriteLine("Le client n'est pas enregistré pour recevoir de messages");
}
}
public static void UnsubscribeClient(ChatMessage c, EndPoint clientEP)
{
if (listeAbonnes.ContainsKey(clientEP))
{
listeAbonnes.Remove(clientEP);
Console.WriteLine(c.pseudo + " vient de se desabonner");
}
else
{
Console.WriteLine("Le client n'est pas enregistré pour recevoir de messages");
}
}
}
}
\ No newline at end of file
No preview for this file type
No preview for this file type
453db3711101fdce3148d209af64b97defbb8e99
b1a7329233bd6dfa2c59d600afd74cf279b11a70
No preview for this file type
No preview for this file type
Markdown is supported
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