Académie d`Amiens

Transcription

Académie d`Amiens
Académie d’Amiens
Section de Technicien Supérieur en
Informatique de Gestion
Option Développeur d’Applications
Session 2012
Lycée Saint Rémi
MARE Tony
Épreuve E5
Pratique des techniques informatiques
Fiche d’activité
N° 3
Titre de l’activité
Cadre de l’activité
Compétences
principales
GeekStation : Sky Messenger
Action personnelle réalisée en autonomie
C36 : Développer dans le cadre d’une architecture client/serveur
Logiciels utilisés
version 2012
Langage, base de données et serveur web utilisés
Langage c# ; Aucune base de données
Description des fonctionnalités de l’activité
-
-
Permet le dialogue en temps réel entre machine connectes au réseau local et utilisant le logiciel
GeekStation
o Dialogue en chat principal
o Dialogue en chat provée
Commandes grâce à « /commande »
Fonctionnalités des logiciels mises en œuvre
Mode Graphique
Application multiutilisateur – client/serveur
MARE Tony
Session2012
Page 1/5
Description de l’application
Application permettant de communiqué par le réseau local.
Lors du démarrage de la GeekStation, le pseudo est demandé à l’utilisateur, par défaut il est l’IP de
celui-ci.
Les messages envoyés sont cryptés grâce au RSA à partir du client, et le serveur les décrypte.
La liste des connectés est affiché dans la GroupBox « Connecté(s) : »
Avec la commande /mp <pseudo> on envoi des messages privées dans une fenêtre de chat privée, un
nouvel onglet.
La commande /help permet d’afficher toutes les commandes utilisables.
La commande /about affiche le aPropos
La commande /pseudo permet de changer de pseudo.
Le programme lorsqu’il est minimisé est affiché dans la barre des tâches sous formes d’un îcone, des
notifications sont affichés lorsqu’un contact parle. En arrière plan, l’onglet de la barre des tâches
clignote dans le même cas.
Les principaux formulaires
MARE Tony
Session2012
Page 2/5
Extrait du code de l’application
/// <summary>
/// Envoie un message au client
/// </summary>
/// <param name="type">Type du message</param>
/// <param name="msg">Contenu du message</param>
public void EnvoieData(Data.Type type, String msg)
{
if (type == Data.Type.Message || type == Data.Type.DirectMessage || type ==
Data.Type.Deconnexion)
{
msg = rsa.Encrypt(msg);
}
try
{
new BinaryFormatter().Serialize(network_stream, new Data(type, msg));
}
catch
{
if (EstActif)
EcrireMessage("Peer Deconnexioned : " + pseudo, true, true, false, false,
false);
}
false);
}
Dispose();
/// <summary>
/// Ecoute le client en attente de message
/// </summary>
public void ReceiveData()
{
while (EstActif)
{
try
{
HandleData((Data)new BinaryFormatter().Deserialize(network_stream));
}
catch
{
if (EstActif)
EcrireMessage("Peer Deconnexioned : " + pseudo, true, true, false, false,
}
}
}
Dispose();
/// <summary>
/// Traite le message reçu selon son type
/// </summary>
/// <param name="myData">Message</param>
private void HandleData(Data myData)
{
if (myData.type == Data.Type.Annoncer)
{
IPAddress ip;
int port;
String[] tabIp = myData.msg.Split(new char[] { ':' },
StringSplitOptions.RemoveEmptyEntries);
if (tabIp.Length > 0 && IPAddress.TryParse(tabIp[0], out ip))
{
MARE Tony
Session2012
Page 3/5
if (tabIp.Length > 1 && int.TryParse(tabIp[1], out port))
Program.maForm.Connect(ip, port);
else
Program.maForm.Connect(ip);
}
}
else if (myData.type == Data.Type.PriseContact)
{
int idx = myData.msg.LastIndexOf('|');
pseudo = GetUniquePseudo(myData.msg.Substring(0, idx));
rsa.publickey = myData.msg.Substring(idx + 1);
EcrireMessage("Nouveau contact : " + pseudo, true, false, false, false, false);
}
else if (myData.type == Data.Type.DirectMessage)
{
if (!EstIgnorer)
{
String msg = rsa.Decrypt(myData.msg);
if (msg.StartsWith("/me"))
msg = "*" + pseudo + " " + msg.Remove(0, 3).Trim();
else
msg = pseudo + ": " + msg;
}
EcrireMessage(msg, false, true, true, true, true);
}
else if (myData.type == Data.Type.Message)
{
if (!EstIgnorer)
{
String msg = rsa.Decrypt(myData.msg);
if (msg.StartsWith("/me"))
msg = "*" + pseudo + " " + msg.Remove(0, 3).Trim();
else
msg = pseudo + ": " + msg;
}
EcrireMessage(msg, true, false, true, false, true);
}
else if (myData.type == Data.Type.Deconnexion)
{
String msg = rsa.Decrypt(myData.msg);
EcrireMessage(pseudo + " vient de se déconnecter (" + msg + ")", true, true,
false, false, false);
EstActif = false; //KILL IT
}
else if (myData.type == Data.Type.ChangerPseudo)
{
StringBuilder historiquepseudo = new StringBuilder();
String newpseudo = GetUniquePseudo(myData.msg);
Program.maForm.UpdateTabChat(newpseudo, true);
int n = Program.maForm.tabClient.Count;
for (int i = 0; i < n; i++)
{
MARE Tony
Session2012
Page 4/5
if (Program.maForm.tabClient[i].EstActif &&
Program.maForm.tabClient[i].pseudo == pseudo)
{
historiquepseudo = Program.maForm.tabClient[i].Historique;
}
}
for (int i = 0; i < n; i++)
{
if (Program.maForm.tabClient[i].EstActif &&
Program.maForm.tabClient[i].pseudo == newpseudo)
{
Program.maForm.tabClient[i].Historique = historiquepseudo;
}
}
Program.maForm.UpdateTabChat(pseudo, false);
false, false);
}
EcrireMessage(pseudo + " s'appelle maintenant " + newpseudo, true, true, false,
pseudo = newpseudo;
}
Conclusion
La communication client/serveur étant une de mes lacunes, ce projet m’a permis de comprendre le
fonctionnement d’une application multiutilisateur en réseau.
MARE Tony
Session2012
Page 5/5

Documents pareils