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