8

Click here to load reader

etudes des sokects sous windev

Embed Size (px)

DESCRIPTION

etudes des sokects sous windev

Citation preview

  • COURS WINDEV NUMERO 5

    14/02/2015 tudes des Sockets, communication rpartie

    Rappels de notions rseaux, Tcp/ip, Ports

  • Cours Windev numro 5

    http://www.btsig.org/ Jean-Luc Baptiste Page 1 sur 7

    Cours Windev numro 5 V E R S I O N 1 9

    Grce ce nouveau Tp nous allons rentrer dans le monde merveilleux de la communication distante via

    rseau. Cette jolie introduction pour vous faire comprendre que ce support va vous apprendre faire

    discuter 2 (ou plusieurs) ordinateurs entre eux. Nous allons employer les Sockets et les threads.

    Commenons par dfinir ces 2 termes :

    Les Sockets : (Tous ceux qui pensent une chaussette sont virs) Une Socket est dfinie comme une

    extrmit dune communication.

    Une paire de processus (ou de Threads) communiquant sur un rseau emploie une paire de sockets, une

    pour chaque processus. Une socket est constitue dune adresse IP concatne un numro de port. En

    gnral les sockets utilisent une architecture Client/Serveur. Le serveur attend des requtes entrantes du

    client en coutant un port spcifique. Ds rception dune requte, il accepte une connexion de la socket

    du client. Les serveurs implmentant des services particuliers (par exemple, telnet, ftp, mail, http), coutent

    des ports bien connus (Telnet coute le port 23, un serveur ftp le port 21, un serveur web [ Http ] le port

    80 ). Les ports infrieurs 1024 sont considrs comme connus et sont utilisables pour les services standards.

    Lorsquun thread client commence une requte de connexion, il se voit assigner un port par la machine hte.

    Ce port est un nombre suprieur 1024.

    Par exemple, lorsquun client de lhte X dadresse Ip 192.168.5.20 souhaite tablir une connexion avec

    un serveur Web (qui coute le port 80) dadresse 192.168.6.10, lhte X peut se voir affecter le port

    1625. La connexion est constitue dune paire de sockets : (192.168.5.20 : 1625) sur lhte X et

    (192.168.6.10 : 80) sur le serveur Web.

    Un thread peut tre peru comme un flot de contrle lintrieur dun processus. Dans notre cas il

    joue le rle dinterface entre les 2 ordinateurs, interceptant les donnes transmises.

    Notre exercice consistera crer 2 excutables, un client et un serveur. Le serveur sera en attente de

    rception de message et le client essayera de se connecter au serveur et de lui envoyer des messages.

    Pour cela il nous faudra 2 projets un pour le client, un pour le serveur

    Je vous rappelle que plus on avance au fil des supports moins je dtaille les fonctionnalits que je considre

    comme devant tre acquises. Donc si ce stade vous prouvez des difficults reprenez les cours prcdents.

    Nous montons en gamme en terme dexpertise donc il est probable que vous prouverez certaines

    difficults sur ce support. Restez motiv et recommencez le autant de fois que ncessaire. Le but tant de

    le raliser sans avoir recours ce support.

  • Cours Windev numro 5

    http://www.btsig.org/ Jean-Luc Baptiste Page 2 sur 7

    PARTIE SERVEUR

    Vous allez commencer par crer un nouveau projet nomm Serveur . Nous ne travaillerons pas sur des

    fichiers donc faites en sorte de n'utiliser aucune analyse. Nous naurons besoin que dune fentre que vous

    nommerez Depart et qui sera la premire fentre du projet. Faites en sorte quelle ressemble celle-

    ci :

    Analysons le fonctionnement du serveur :

    Il faut lui donner un port a couter.

    Il faut lancer la boucle dcoute ( boucle infinie ) et faire en sorte que les vnements dentrs ( demande

    de connexion) soient traits par des threads.

    Une fois la connexion accepte le texte recu sera inscrit dans la liste droulante.

    Retroussons nos manches et en avant pour le codage. Nous allons commencer par crer une procedure

    dattente ( la boucle dcoute ). Pour cela crez une procdure globale nomme attente

    Cette zone de texte nous indiquera si le

    serveur est actif ou pas. Cest un objet

    champ de saisie que vous nommerez

    etatserveur

    Ici safficheront les phrases envoyes

    par le client. Cest un objet liste que vous

    nommerez liste1

    Cette zone est destine recevoir le numro du port dcoute. Cest un objet champ de saisie que vous

    nommerez portip

    Ces 2 boutons seront nomms

    demarre et arrete . A vous de

    choisir qui est qui.

  • Cours Windev numro 5

    http://www.btsig.org/ Jean-Luc Baptiste Page 3 sur 7

    Voici le code que nous allons analyser.

    PROCEDURE attente()

    BOUCLE // dbut de la boucle

    SI SocketAttendConnexion("serveur") ALORS // si une demande de connexion est en attente

    canal est une chane

    canal=SocketAccepte("serveur") //Cette fonction permet de crer le canal de communication entre

    la socket serveur et la socket cliente.

    ThreadExcute(threadcnx,threadNormal,"affichemes",canal) //Lance l'excution d'un "thread"

    Multitache(-30) //La fonction Multitache avec un negatif suspend lapplication

    FIN

    FIN

    Vous pouvez constater que nous nous trouvons devant une boucle sans fin ou en attente dite active. A

    lintrieur de cette boucle une fonction WinDev ( SocketAttendConnexion ), est charge de verifier si des

    demandes de connexion se produisent. Comme parametre cette fonction prend un argument qui est le nom

    de la socket ici serveur. Ne vous inquietez pas pour linstant, vous allez voir ou nous allons dfinir la

    socket nomme serveur. Pour linstant lessentiel est de comprendre le principe de la boucle dattente

    active. Donc si une demande de connexion se produit pour la socket serveur on laccepte en crant un

    canal de communication. Vous pouvez considrer ce canal comme un tunel ou les donnes vont transiter.

    La ligne : ThreadExcute(threadcnx,threadNormal,"affichemes",canal), est charge de faire en sorte que

    le code de la fonction affichemes soit execute comme un Thread normal appel threadcnx utilisant le

    parametre canal)

    Multitache(-30) : L'excution de l'application est suspendue durant 100me de seconde.

    D'autres traitements peuvent tre excuts durant cette priode de temps (r-affichage ou excution d'un

    code de clic par exemple). Dans notre cas la boucle est gele pour permettre aux threads de sexcuter

    durant leurs quantums.

    Donc : la socket sappelle serveur , le canal cre sappelle canal, le thread gestionnaire se nomme

    threadcnx .

    Jadmets quau premier abord cela puisse vous sembler complexe, alors que cest extrmement logique.

    Relisez le paragraphe prcdent et imaginez le fonctionnement : la boucle sans fin, lattente de connexion,

    le traitement de la connexion.

    Maintenant nous allons nous intresser la procdure affichemes .Cest elle le cur de notre serveur

    puisque cest la gestionnaire dvnement. Pour ce faire crez une procdure globale affichemes

    (affichemes pour affiche messages).

  • Cours Windev numro 5

    http://www.btsig.org/ Jean-Luc Baptiste Page 4 sur 7

    PROCEDURE affichemes(canal)

    texte est une chane

    BOUCLE

    texte=SocketLit(canal,Vrai)

    ListeAjoute(""depart.Liste1"",texte)

    FIN

    ThreadArrte("",500)

    Multitache(-30)

    Comme vous pouvez le constater la procdure prend comme paramtre le nom du canal reliant les 2

    sockets. Je vous rappelle que cette procdure est lance en tant que thread. La fonction WinDev SocketLit

    lit le contenu du canal et le mets dans la variable texte. Le paramtre vrai signifie SocketLit que la dure

    dattente sur canal est indfinie. Une fois le message rcupr il doit tre mis dans notre liste droulante

    liste1 . Le reste de la procdure nappelle pas de commentaires particuliers.

    Continuons par le code du bouton demarre.

    SI PAS SocketCre("serveur",PORTIP,NetAdresseIp()) ALORS

    Erreur("Erreur de cration " + ErreurInfo(errMessage))

    ETATSERVEUR="Problme lors du dmarrage du serveur"

    SINON

    ETATSERVEUR="Serveur dmarr"

    ThreadExcute("thread1",threadNormal,attente)

    FIN

    Ce code lance lexcution du serveur. La procdure WinDev SocketCrer utilise plusieurs parametres :

    Le nom de la socket que lon va crer.

    Le port sur lequel on coute.

    Ladresse ip du poste serveur.

    Comme vous le voyez la lecture de ce code si la socket serveur est cre on fait de notre procdure

    globale attente un thread qui appellera lui meme le thread affichemes. Cest pas super linformatique

    ?

  • Cours Windev numro 5

    http://www.btsig.org/ Jean-Luc Baptiste Page 5 sur 7

    Voici le code du bouton arreter

    SocketFerme("serveur")

    ETATSERVEUR="Arret du serveur"

    Voil la partie serveur est maintenant termine Il ne vous reste plus qua crer lexcutable (Menu

    Projet/Crer lexecutable).

    NB: Si vous avez des Warnings concernant une boucle sans condition de sortie ne vous en souciez pas !

    Ds a prsent vous avez concu un serveur, il ne nous reste plus qua crer le client. Son rle est dessayer

    de se connecter au serveur et de lui envoyer des message. Cest clair ? Alors Avanti !

    Partie Cliente

    Pour le client, comme ce doit etre une application autonome, il nous faut donc crer un projet, sans analyse

    ayant pour nom Client. Ce projet ne contiendra quune fenetre nomme Depart. Elle ressemblera a

    ceci :

    Objet champ de saisie

    Nom : Adrip

    Objet : champ de saisie.

    Nom : Portip

    Objet : Champ de saisie.

    Nom : messa

    Objet : Champ de saisie.

    Nom : EtatCnx

  • Cours Windev numro 5

    http://www.btsig.org/ Jean-Luc Baptiste Page 6 sur 7

    Comme vous pouvez le constater le client est vraiment minimaliste. On saisit ladresse ip du serveur, le port

    dcoute, le message transmettre. Le bouton Connexion nous servira pour tablir la liaison, le bouton

    envoyer transmettra le message.

    Interressons nous au bouton connexion. Son rle est de nous mettre en relation avec la socket du serveur.

    Donc il est impratif que le serveur soit actif avant le client, mais ca les plus russ lavaient remarqu

    Voici le code du bouton :

    SI PAS SocketConnecte("serveur", PORTIP,ADRIP) ALORS

    Erreur("erreur de connexion " + ErreurInfo(errMessage))

    SINON

    ETATCNX="Vous etes en ligne"

    FIN

    On essaye de ce connecter la socket nomme Serveur ( vous savez cest celle que lon vient de crer

    cot serveur ?!), coutant le port dfini ( PORTIP), telle adresse IP (ADRIP). Si tout ce passe bien on ecrit

    Vous etes en ligne dans le champ de saisie Etatcnx. Sinon on envoie le message derreur.

    Ben oui, cest tout Simple, non ?

    Maintenant voyons le code du bouton envoyer.

    SI SocketEcrit("serveur", messa) = Faux ALORS

    Info("Un problme est survenu")

    FIN

    On envoit un message ( le texte contenu dans le champ de saisie messa ) la socket serveur. Si ca ne

    fonctionne pas on affiche une boite de dialogue davertissement.

    Voil tout est fini, vous pouvez compiler, crer lexecutable et tester votre client/serveur. Pour la mise en

    uvre vous avez besoin de lancer le serveur, le mettre en coute dun port. Ensuite vous lancez le client

    que vous branchez sur le port dcoute et envoyez le message. Si vous etes en rseau utilisez la bonne

    adresse ip du serveur et have fun !!

  • Cours Windev numro 5

    http://www.btsig.org/ Jean-Luc Baptiste Page 7 sur 7

    Exercices applicatifs

    Maintenant que vous tes un pro de la socket essayez de raliser lexercice suivant.

    A partir de l'executable faites en sorte que le client oblige le serveur a executer une action ( par exemple

    activer la calculatrice )

    Pistes de ralisation :

    Cot client creez un bouton qui envoie le chiffre 1 par exemple la socket serveur.

    Cot serveur analysez les mesages recu et si message =1 alors ..

    Avec cet exercice vous etes en train dapprendre les base dun outils de maintenance distance. A vous

    de le perfectionner

    Pour faire lancer une application windows par Windev voici la syntaxe : LanceAppli("CALC.EXE ). Calc.exe

    tant la calculatrice