Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)



Documents pareils
Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

DUT Informatique Module Système S4 C Département Informatique 2009 / Travaux Pratiques n o 5 : Sockets Stream

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

Logiciel de connexion sécurisée. M2Me_Secure. NOTICE D'UTILISATION Document référence :

Le MSMQ. Version 1.0. Pierre-Franck Chauvet

Installation et utilisation du client FirstClass 11

Internet - Outils. Nicolas Delestre. À partir des cours Outils réseaux de Paul Tavernier et Nicolas Prunier

Programmer en JAVA. par Tama

Programme Compte bancaire (code)

CONFIGURATION FIREWALL

Le Multicast. A Guyancourt le

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Notice d installation des cartes 3360 et 3365

Java Licence Professionnelle CISII,

Thunderbird est facilement téléchargeable depuis le site officiel

CREER UN ENREGISTREMENT DANS LA ZONE DNS DU DOMAINE

Hébergement et configuration de services WCF. Version 1.0

Couche application. La couche application est la plus élevée du modèle de référence.

Introduction à la Programmation Parallèle: MPI

SYSTEME DE GESTION DES ENERGIES EWTS EMBEDDED WIRELESS TELEMETRY SYSTEM

Projet de programmation (IK3) : TP n 1 Correction

Exécutif temps réel Pierre-Yves Duval (cppm)

Dis papa, c est quoi un bus logiciel réparti?

Principe de la messagerie électronique

Documentation Honolulu 14 (1)

Notions fondamentales du langage C# Version 1.0

RÉALISATION D UN SITE DE RENCONTRE

Système téléphonique d entreprise SIVOTEL. T P 0 P r i s e e n m a i n d u s y s t è m e ( O F : S I V O T E L - T P 0 )

Network musical jammin

GUIDE UTILISATEUR ENVOYEZ ET RECEVEZ VOS FAX ET SMS PAR

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

IceWarp Desktop Client permet de gérer à la fois les s, les calendriers, les contacts et les messages instantanés.

Editer un script de configuration automatique du proxy

DHCP et NAT. Cyril Rabat Master 2 ASR - Info Architecture des réseaux d entreprise

ADO.NET. Ado.net propose deux modes d'accès, le mode connecté et le mode déconnecté.

Club informatique Mont-Bruno Séances du 18 janvier et du 17 février 2012 Présentateur : Michel Gagné

Guide d utilisation pour W.access - Client

Espace de stockage intermédiaire. Compte de Messagerie. Communication «Asynchrone» «Compte de Messagerie»

Le hub d entreprise est une application de déploiement des applications mais aussi un outil de communication

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Configuration de Zabbix

Installation de serveurs DNS, WINS et DHCP sous Windows Server 2003

L3 informatique Réseaux : Configuration d une interface réseau

RAPPORT DE CONCEPTION UML :

CONDITIONS GENERALES D UTILISATION DU PROGRAMME SEAT CONNECTED PEOPLE A DESTINATION DES INTERNAUTES

EPREUVE PRATIQUE DES TECHNIQUES INFORMATIQUES ACTIVITE N 1. Thème de l activité : Configuration d un firewall

Plateforme PAYZEN. Définition de Web-services

Administration des ressources informatiques

Lync 2013 Communiquez par messagerie instantanée, vidéo conférence, réunion virtuelle... - Version numérique

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

La messagerie électronique avec La Poste

ENVOYEZ ET RECEVEZ VOS FAX ET SMS PAR !

Manuel Utilisateur Téléphone IP Thomson ST 2030

Internets. Informatique de l Internet: le(s) Internet(s) Composantes de l internet R3LR RENATER

Introduction. Adresses

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Manuel d extension Assistant 3CX, Portail utilisateur MyPhone, Codes abrégés & Messagerie vocale pour système téléphonique 3CX Version 8.

Multicast & IGMP Snooping

Installation et paramétrage de Fedora dans VirtualBox.

2. MAQUETTAGE DES SOLUTIONS CONSTRUCTIVES. 2.2 Architecture fonctionnelle d un système communicant.

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Création d une connexion VPN dans Windows XP pour accéder au réseau local de l UQO. Document préparé par le Service des technologies de l information

Sélection du contrôleur

Un ordonnanceur stupide

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Club informatique Mont-Bruno Séances du 18 janvier et du 17 février 2012 Présentateurs : Michel Gagné et Réjean Côté

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

18 TCP Les protocoles de domaines d applications

Réseaux. 1 Généralités. E. Jeandel

Programmation client-serveur sockets - RPC

Programmation Réseau. ! UFR Informatique ! Jean-Baptiste.Yunes@univ-paris-diderot.fr

Dynamic Host Configuration Protocol

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Supervision de réseau

Capture, Filtrage et Analyse de trames ETHERNET avec le logiciel Wireshark. Etape 1 : Lancement des machines virtuelles VMWARE et de Wireshark

CAS IT-Interceptor. Formation «Certificate of Advanced Studies»

Configuration automatique

Les possibilités de paramétrage réseau des logiciels de virtualisation sont les suivantes quant à la connexion réseau :

La téléphonie via Internet..(VoIP) Une solution économique et versatile

Ces deux machines virtuelles seront installées sous VMWARE WORKSTATION.

Sommaire. Etablir une connexion avec une base de données distante sur PostGreSQL

Plan du cours. Historique du langage Nouveautés de Java 7

Configuration Alcatel OmniPCX Office (OXO) OpenIP OpenVoice

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Fonctionnement Kiwi Syslog + WhatsUP Gold

Présentation du modèle OSI(Open Systems Interconnection)

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Début de la procédure

module Introduction aux réseaux DHCP et codage Polytech / 5

1. Fonctionnement de l Internet 2. Protocoles applicatifs 3. Programmation réseau

I-Fax (fax par Internet)

Mini-projet systèmes & réseau serveur de «tchatche»

Problèmes liés à la concurrence

Programmation en Java IUT GEII (MC-II1) 1

II/ Le modèle OSI II.1/ Présentation du modèle OSI(Open Systems Interconnection)

Tous les logiciels cités dans ce document sont des marques déposées de leurs propriétaires respectifs

Transcription:

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée) Propriétés Description Intitulé long Formation concernée Matière Présentation Développement d un logiciel de messagerie instantanée BTS Services informatiques aux organisations SLAM4 - Réalisation et maintenance de composants logiciels Développement d un logiciel de messagerie instantanée. La communication est basée sur les sockets entre deux applications dotnet. Notions Programmation à l aide d objets Développement orienté réseau Transversalité Pré-requis Outils Mots-clés Durée Auteur(es) Version v 1.0 Date de publication Les protocoles réseau Le langage C#, les applications WinForms. Les applications fournies ont été réalisées avec Visual Studio 2008 et sont destinées au framework dotnet 3.5, elles peuvent facilement être recompilées avec un autre outil et/ou cibler une autre version du framework. - CoursSockets.doc : support de cours élève. - Exemple01 : un premier exemple d application simple. - Exemple02 : exemple de réception asynchrone. - Exemple03 : utilisation d un objet BackgroundWorker. - Chat : application simple de chat. C #, DotNet 10 heures Pierre Loisel Novembre 2008 Ce document n est pas une étude exhaustive du domaine. Il présente simplement une manière de réaliser des applications communicantes en C#. L exécution d une application utilisant les sockets à partir d un disque réseau peut poser des problèmes de sécurité. Si vous obtenez une exception concernant la sécurité, configurez les paramètres de sécurité du framework. Vous pouvez consulter la page http://msdn.microsoft.com/frfr/library/2bc0cxhc.aspx pour obtenir des informations concernant l outil.net Framework Configuration (Mscorcfg.msc). http://www.reseaucerta.org CERTA - juin 2011 v1.0 Page 1/15

A/ Présentation 1. Les sockets Les sockets fournissent un mécanisme générique de communication entre les processus. Elles sont apparues pour la première fois en 1986 dans la version UNIX de l université de Berkeley. Un processus peut être sommairement défini comme une application (ou un service) en cours d exécution. Un socket permet à un processus (le client) d envoyer un message à un autre processus (le serveur). Le serveur qui reçoit ce message peut alors accomplir toutes sortes de tâche et éventuellement retourner un résultat au processus client. Lors de la création d un socket, il faut préciser le type d adressage, le type de message et le protocole transport utilisés. Nous utiliseront : IPV4, les datagrammes simples et le protocole UDP. 2. Point de terminaison Un point de terminaison (EndPoint) est défini par une adresse IP et un numéro de port. Une communication s établit entre deux points de terminaison. Un processus serveur reçoit les messages destinés à un numéro de port et à un protocole transport (UDP, TCP,...) déterminés. Un client désirant envoyer un message à un serveur doit donc créer un point de terminaison représentant le récepteur du message en fournissant l adresse IP du serveur et le numéro de port écouté. Pour envoyer un message, un processus doit également créer un point de terminaison représentant l émetteur du message en fournissant sa propre adresse IP. Il ne fournit pas de numéro de port, c est le système qui attribuera un numéro de port libre pour la communication. 3. Principe de communication Lors de l envoi d un message, il faut : - Créer un socket, - Créer le point de terminaison émetteur, - Lier le socket au point de terminaison émetteur (ce qui précisera le protocole transport utilisé pour l émission). - Créer le point de terminaison récepteur, - Envoyer le message à l aide du socket vers le point de terminaison récepteur. Pour recevoir un message, le processus serveur doit : - Créer un socket, - Créer le point de terminaison récepteur (lui-même donc), - Lier le socket au point de terminaison récepteur (ce qui précisera le protocole transport utilisé pour la réception). - Créer le point de terminaison émetteur (sans préciser l adresse IP ni le numéro de port puisqu ils ne sont pas connus à ce stade). - Mettre le socket en état de réception en lui fournissant un buffer pour les données à recevoir, et une référence au point de terminaison émetteur. - Lorsque le message est effectivement reçu, le point de terminaison émetteur est renseigné. http://www.reseaucerta.org CERTA - juin 2011 v1.0 Page 2/15

4. Premier exemple (exemple01) Le client : public Fm_client() CheckForIllegalCrossThreadCalls = false; InitializeComponent(); adriplocale = getadriplocalev4(); private IPAddress adriplocale; private IPAddress getadriplocalev4() string hote = Dns.GetHostName(); IPHostEntry iplocales = Dns.GetHostEntry(hote); foreach (IPAddress ip in iplocales.addresslist) if (ip.addressfamily == AddressFamily.InterNetwork) return ip; return null; // aucune adresse IP V4 private void bt_envoyer_click(object sender, EventArgs e) byte[] message; Socket sock = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint epemetteur = new IPEndPoint(adrIpLocale, 0); sock.bind(epemetteur); IPEndPoint eprecepteur = new IPEndPoint( IPAddress.Parse(tb_ipDestinataire.Text), 33000); message = Encoding.Unicode.GetBytes(tb_message.Text); sock.sendto(message, eprecepteur); sock.close(); Remarque : la chaîne à envoyer est transformée en un tableau de bytes. http://www.reseaucerta.org CERTA - juin 2011 v1.0 Page 3/15

Le serveur : public Fm_serveur() CheckForIllegalCrossThreadCalls = false; InitializeComponent(); adriplocale = getadriplocalev4(); private IPAddress adriplocale; private IPAddress getadriplocalev4() string hote = Dns.GetHostName(); IPHostEntry iplocales = Dns.GetHostEntry(hote); foreach (IPAddress ip in iplocales.addresslist) if (ip.addressfamily == AddressFamily.InterNetwork) return ip; return null; // aucune adresse IP V4 private void bt_recevoir_click(object sender, EventArgs e) byte[] message = new byte[40]; Socket sock = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint eprecepteur = new IPEndPoint(adrIpLocale, 33000); sock.bind(eprecepteur); sock.receivefrom(message, ref eptemp); IPEndPoint epemetteur = (IPEndPoint)epTemp; string strmessage = Encoding.Unicode.GetString(message); MessageBox.Show( epemetteur.address.tostring() + " -> " + strmessage); Remarques : - La fonction getadriplocalev4 retourne l adresse IP V4 de l hôte en utilisant le service DNS. Le nom de l hôte local est récupéré en utilisant le DNS. - Elle est appelée dans le constructeur du formulaire. - La méthode ReceiveFrom de la classe Socket attend un paramètre de type EndPoint. Il faut donc opérer une conversion de type pour récupérer le point de terminaison émetteur. - Le message est un tableau de bytes. Il faut le transformer en chaîne de caractères. - L instruction «CheckForIllegalCrossThreadCalls = false;» dans le constructeur des deux formulaires permet de s affranchir simplement des problèmes liés à la mise à jour de l interface lors de la réception d un message. http://www.reseaucerta.org CERTA - juin 2011 v1.0 Page 4/15

Mise en œuvre : - Créer l application client et l application serveur. - Lancer les deux applications (sur le même poste ou sur deux postes différents). - Cliquer sur le bouton recevoir du serveur. - Renseigner l adresse IP du serveur et le message à envoyer dans l application client. - Cliquer sur le bouton envoyer du client. - Le serveur affiche l adresse IP et le message du client. B/ Réception asynchrone 1. Principe Lorsque l on clique sur le bouton recevoir du serveur, celui-ci se trouve bloqué en attente du message et ne peut accomplir aucune autre tâche. Pour y remédier, il est possible d utiliser le mécanisme de réception asynchrone fourni par Dotnet. Ce mécanisme est basé sur les threads. Un thread peut être vu comme un «mini processus» interne à une application. Une application peut avoir plusieurs threads et donc exécuter plusieurs tâches simultanément (cette simultanéité n est que fictive, en tous cas sur une machine mono-processeur). Le principe est le suivant : > Mettre le socket en état de réception en utilisant la méthode ci-dessous : sock.beginreceivefrom(message,0,40, SocketFlags.None, ref eptemp, new AsyncCallback(recevoir),null); - Le socket est mis en état de réception dans un thread de réception différent du thread principal. Le thread principal poursuit immédiatement son exécution, le programme n est pas bloqué par cet appel. - L avant dernier paramètre indique que la méthode recevoir doit être appelée dès la réception d un message par le thread de réception. > Gérer le message reçu : Quand le thread de réception reçoit le message, il le prend en charge (l affiche par exemple), et se termine. L idéal est de remettre le socket en état de réception immédiatement, de manière à accepter plusieurs messages les uns après les autres. http://www.reseaucerta.org CERTA - juin 2011 v1.0 Page 5/15

2. Modification du serveur (exemple02) public Fm_serveur() CheckForIllegalCrossThreadCalls = false; InitializeComponent(); init(); private int lgmessage = 40; private IPAddress adriplocale; private Socket sock; private IPEndPoint eprecepteur; byte[] message; private IPAddress getadriplocalev4() // Idem version pécédente private void init() message = new byte[lgmessage]; adriplocale = getadriplocalev4(); sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); eprecepteur = new IPEndPoint(adrIpLocale, 33000); sock.bind(eprecepteur); sock.beginreceivefrom( message, 0, lgmessage, SocketFlags.None, ref eptemp, new AsyncCallback(recevoir), null); private void recevoir(iasyncresult AR) sock.endreceivefrom(ar, ref eptemp); IPEndPoint epemetteur = (IPEndPoint)epTemp; string strmessage; strmessage = Encoding.Unicode.GetString(message, 0, message.length); Array.Clear(message, 0, message.length); sock.beginreceivefrom( message, 0, lgmessage, SocketFlags.None, ref eptemp, new AsyncCallback(recevoir), null); MessageBox.Show( epemetteur.address.tostring() + " -> " + strmessage); Remarques : - Le serveur se met en réception dès le lancement de l application, il n y a donc plus besoin d un bouton recevoir. - Dès la réception d un message, le serveur relance un nouveau thread de réception. - La réception ne s arrête qu à la fermeture du programme. - Vous pouvez tester l envoi de messages à partir de deux clients différents. http://www.reseaucerta.org CERTA - juin 2011 v1.0 Page 6/15

C/ Un exemple plus complet 1. Améliorer l interface Modifiez votre application serveur de la manière suivante : - Ajouter un contrôle de type ListBox (lb_messages) sur le formulaire. - Au lieu d afficher le message reçu, la méthode recevoir doit maintenant ajouter ce message à la liste lb_messages. - Ajouter une propriété nbmessages à la classe Fm_serveur. Cette propriété sera destinée à compter le nombre de messages reçus. - Ce nombre de messages sera affiché dans un label lbl_nbmessages. 2. Gérer un message plus complexe Le client va maintenant envoyer un message constitué de son adresse IP et du texte du message luimême. Une solution simple consiste à envoyer une chaîne contenant les deux éléments séparés par un caractère particulier. Exemple : «192.168.200.3#Le texte du message#». A la réception de cette chaîne, le serveur doit retrouver les deux éléments du message. Il peut le faire de la manière suivante : - Récupérer le message reçu sous la forme d une chaîne de caractères : strmessage = Encoding.Unicode.GetString(message, 0, message.length); - Isoler les différents elements dans un tableau de chaînes : string[] tabelements; char[] separateur = new char[1]; separateur[0] = '#'; tabelements = strmessage.split(separateur); - tabelements[0] contient l adresse IP. - tabelements[1] contient le texte du message. Remarques : - La méthode Split découpe la chaîne strmessage en plusieurs éléments et place ces éléments dans le tableau tabelements. - Elle prend en paramètre un tableau contenant les caractères jouant le rôle de séparateur pour découper la chaîne strmessage. - Il faut donc que ce tableau contienne le caractère #. http://www.reseaucerta.org CERTA - juin 2011 v1.0 Page 7/15

3. Modification du serveur (exemple03) private int nbmessages; // idem private void init() nbmessages = 0; // idem private void recevoir(iasyncresult AR) sock.endreceivefrom(ar, ref eptemp); string strmessage; strmessage = Encoding.Unicode.GetString( message, 0, message.length); string[] tabelements; char[] separateur = new char[1]; separateur[0] = '#'; tabelements = strmessage.split(separateur); nbmessages++; string affichage = tabelements[0] + " -> " + tabelements[1]; lb_messages.items.add(affichage); lbl_nbmessages.text = "Nombre de messages reçus : " + nbmessages.tostring(); Array.Clear(message, 0, message.length); sock.beginreceivefrom( message, 0, lgmessage, SocketFlags.None, ref eptemp, new AsyncCallback(recevoir), null); http://www.reseaucerta.org CERTA - juin 2011 v1.0 Page 8/15

D/ Une vraie conversation 1. Transmettre un message à tout le monde Pour transmettre un message à plusieurs hôtes, il y a au moins deux solutions : - Transmettre le même message successivement aux différents destinataires, ce qui nécessite une simple boucle. - Envoyer le message en broadcast. Pour envoyer un message en broadcast, il suffit de modifier ainsi la procédure d envoi : private void bt_envoyer_click(object sender, EventArgs e) byte[] messagebytes; Socket sock = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); sock.setsocketoption( SocketOptionLevel.Socket, SocketOptionName.Broadcast, true); IPEndPoint epemetteur = new IPEndPoint(adrIpLocale, 0); sock.bind(epemetteur); IPEndPoint eprecepteur = new IPEndPoint(IPAddress.Broadcast, 33000); string lemessage = "Contenu du message"; messagebytes = lemessage.getinfos(); sock.sendto(messagebytes, eprecepteur); sock.close(); Le message sera reçu par tous les hôtes en état de réception sur le port UDP 33000. 2. Définir un protocole Il s agit de fixer les règles de la communication entre les différentes applications. Imaginons l exemple d un pauvre chat : - Nous avons un serveur et plusieurs clients. - Lorsqu un client se connecte, il en informe le serveur. - Le serveur conserve la liste des clients connectés. - Lorsqu un client envoie un message au serveur, celui-ci le transmet à l ensemble des clients. - Lorsqu un client se déconnecte, il en informe le serveur. - Les clients sont repérés par leur adresse IP, l unicité des pseudos n est pas assurée. Nous avons besoin de définir plusieurs types de messages : - Connexion (type C) Emetteur : un client qui se connecte Récepteur : le serveur Contenu : L adresse IP et le pseudo du client Réaction du serveur : mémorisation du pseudo http://www.reseaucerta.org CERTA - juin 2011 v1.0 Page 9/15

- Envoi (type E) Emetteur : un client qui envoi un texte sur le chat Récepteur : le serveur Contenu : l adresse IP du client et le texte envoyé Réaction du serveur : réémission du texte à tous les clients - Réémission (type R) Emetteur : le serveur Récepteur : les clients Contenu : l adresse IP du serveur, le pseudo de l auteur du texte et le texte lui-même Réaction des clients : affichage du pseudo et du texte - Déconnexion (type D) Emetteur : un client qui se déconnecte, c'est-à-dire qui quitte l application Récepteur : le serveur Contenu : l adresse IP du client et son pseudo Réaction du serveur : mise à jour de la liste des clients connectés E/ Le pauvre chat (Chat) 1. Le client Généralités : - L adresse IP du serveur est supposée connue. - Il faut également déterminer les ports utilisés par le serveur et par les clients. http://www.reseaucerta.org CERTA - juin 2011 v1.0 Page 10/15

public partial class Fm_client : Form public Fm_client() CheckForIllegalCrossThreadCalls = false; InitializeComponent(); adriplocale = getadriplocalev4(); separateur = new char[1]; separateur[0] = '#'; private IPAddress adriplocale; private char[] separateur; private IPAddress ipserveur = IPAddress.Parse("192.168.3.3"); private int portserveur = 33000; private int portclient = 33001; private int lgmessage = 1000; private Socket sockreception; private IPEndPoint eprecepteur; byte[] messagebytes; private IPAddress getadriplocalev4() // idem L envoi d un message ne pose pas de problème particulier. Chaque message est constitué des éléments suivants : - Le type de message (C, E, R, D). Le client peut envoyer des messages C, E ou D. - Le pseudo à l origine du message. - Le texte du message. private void envoyer(string typemessage,string texte) byte[] messagebytes; Socket sock = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint epemetteur = new IPEndPoint(adrIpLocale, 0); sock.bind(epemetteur); IPEndPoint eprecepteur = new IPEndPoint(ipServeur, portserveur); string infos = typemessage + "#" + tb_pseudo.text + "#" + texte + "#"; messagebytes = Encoding.Unicode.GetBytes(infos); sock.sendto(messagebytes, eprecepteur); sock.close(); tb_message.clear(); tb_message.focus(); http://www.reseaucerta.org CERTA - juin 2011 v1.0 Page 11/15

Quand l utilisateur clique sur «se connecter», le message de connexion est envoyé au serveur (il ne contient pas de texte) et le client se met en état de réception. Il devient ensuite possible de poster un texte sur le chat. private void bt_connecter_click(object sender, EventArgs e) if (tb_pseudo.text!= "") bt_connecter.enabled = false; tb_pseudo.enabled = false; envoyer("c", ""); bt_envoyer.enabled = true; tb_message.enabled = true; initreception(); tb_message.focus(); private void initreception() messagebytes = new byte[lgmessage]; sockreception = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); eprecepteur = new IPEndPoint(adrIpLocale, portclient); sockreception.bind(eprecepteur); sockreception.beginreceivefrom( messagebytes, 0, lgmessage, SocketFlags.None, ref eptemp, new AsyncCallback(recevoir), null); A la réception d un message, le client met à jour son interface. private void recevoir(iasyncresult AR) sockreception.endreceivefrom(ar, ref eptemp); string strmessage = Encoding.Unicode.GetString( messagebytes, 0, messagebytes.length); string[] tabelements; tabelements = strmessage.split(separateur); switch (tabelements[0]) case "R": lb_messages.items.add( tabelements[1] + " -> " + tabelements[2]); break; Array.Clear(messageBytes, 0, messagebytes.length); sockreception.beginreceivefrom( messagebytes, 0, lgmessage, SocketFlags.None, ref eptemp, new AsyncCallback(recevoir), null); http://www.reseaucerta.org CERTA - juin 2011 v1.0 Page 12/15

Quand l utilisateur clique sur le bouton «envoyer», le texte saisi est envoyé au serveur. private void bt_envoyer_click(object sender, EventArgs e) envoyer("e", tb_message.text); La déconnexion est gérée par un message envoyé à la fermeture du formulaire. private void Fm_client_FormClosing( envoyer("d", ""); object sender, FormClosingEventArgs e) 2. Le serveur Dès son lancement, le serveur se met en état de réception sur son port. public partial class Fm_serveur : Form public Fm_serveur() CheckForIllegalCrossThreadCalls = false; InitializeComponent(); initreception(); private int lgmessage = 1000; private int portserveur = 33000; private int portclient = 33001; private IPAddress adriplocale; private char[] separateur; private Socket sockreception; private IPEndPoint eprecepteur; byte[] messagebytes; private IPAddress getadriplocalev4() // idem http://www.reseaucerta.org CERTA - juin 2011 v1.0 Page 13/15

private void initreception() messagebytes = new byte[lgmessage]; adriplocale = getadriplocalev4(); separateur = new char[1]; separateur[0] = '#'; sockreception = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); eprecepteur = new IPEndPoint(adrIpLocale, portserveur); sockreception.bind(eprecepteur); null); sockreception.beginreceivefrom( messagebytes, 0, lgmessage, SocketFlags.None, ref eptemp, new AsyncCallback(recevoir), Une méthode envoyerbroadcast permet l envoi d un message sur l ensemble du réseau. private void envoyerbroadcast(string pseudo,string texte) byte[] messagebroadcast; Socket sockemission = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); sockemission.setsocketoption( SocketOptionLevel.Socket, SocketOptionName.Broadcast, true); IPEndPoint epemetteur = new IPEndPoint(adrIpLocale, 0); sockemission.bind(epemetteur); IPEndPoint eprecepteur = new IPEndPoint( IPAddress.Broadcast, portclient); string strmessage = "R" + "#" + pseudo + "#" + texte + "#"; messagebroadcast = Encoding.Unicode.GetBytes(strMessage); sockemission.sendto(messagebroadcast, eprecepteur); sockemission.close(); http://www.reseaucerta.org CERTA - juin 2011 v1.0 Page 14/15

Les messages reçus sont traités en fonction de leur type. private void recevoir(iasyncresult AR) sockreception.endreceivefrom(ar, ref eptemp); string strmessage = Encoding.Unicode.GetString( messagebytes, 0, messagebytes.length); string[] tabelements; tabelements = strmessage.split(separateur); switch (tabelements[0]) case "C": lb_clients.items.add(tabelements[1]); break; case "E": envoyerbroadcast(tabelements[1], tabelements[2]); break; case "D": lb_clients.items.remove(tabelements[1]); break; Array.Clear(messageBytes, 0, messagebytes.length); null); sockreception.beginreceivefrom( messagebytes, 0, lgmessage, SocketFlags.None, ref eptemp, new AsyncCallback(recevoir), Finalement, il a du chien notre pauvre chat! http://www.reseaucerta.org CERTA - juin 2011 v1.0 Page 15/15