Anda di halaman 1dari 8

COURS WINDEV NUMERO 5

14/02/2015

tudes des Sockets, communication rpartie


Rappels de notions rseaux, Tcp/ip, Ports

Cours Windev numro 5

Cours Windev numro 5


VERSION 19

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.

http://www.btsig.org/

Jean-Luc Baptiste

Page 1 sur 7

Cours Windev numro 5

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 celleci :
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.

Ici safficheront les phrases envoyes


par le client. Cest un objet liste que vous
nommerez liste1

Cette zone de texte nous indiquera si le


serveur est actif ou pas. Cest un objet
champ de saisie que vous nommerez
etatserveur

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

http://www.btsig.org/

Jean-Luc Baptiste

Page 2 sur 7

Cours Windev numro 5

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 <Temporisation> 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).

http://www.btsig.org/

Jean-Luc Baptiste

Page 3 sur 7

Cours Windev numro 5

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
?
http://www.btsig.org/

Jean-Luc Baptiste

Page 4 sur 7

Cours Windev numro 5

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

http://www.btsig.org/

Objet : Champ de
saisie.
Nom : messa

Jean-Luc Baptiste

Objet : Champ de
saisie.
Nom : EtatCnx

Page 5 sur 7

Cours Windev numro 5

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 !!

http://www.btsig.org/

Jean-Luc Baptiste

Page 6 sur 7

Cours Windev numro 5

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

http://www.btsig.org/

Jean-Luc Baptiste

Page 7 sur 7

Anda mungkin juga menyukai