Vous êtes sur la page 1sur 5

FIT 4 [INF443] 2011/12

Systmes et applications rpartis


Vincent Labatut
Universit Galatasaray

TP 5

oprations bancaires avec sockets

1 Prsentation
Lors des TP sur les threads, nous avions dvelopp une simulation de systmes bancaires : une banque grait des transferts que des agents de transferts lui demandaient deffectuer. La banque et tous les agents taient excuts dans des threads diffrents, mais tous localiss sur la mme machine. Depuis, nous avons appris comment faire communiquer des programmes en utilisant des sockets et des flux. Nous allons utiliser ce mcanisme de communication pour faire voluer notre simulateur de systme bancaire : lobjectif est maintenant que le serveur et chacun des clients puissent tre localiss sur des machines diffrentes. Nous allons utiliser larchitecture client/serveur classique : la banque constituera le serveur. chaque agent de transfert sera un client. On veut que plusieurs clients puissent tre traits en mme temps, cest pourquoi le serveur doit tre multi-client (cf. le TP sur les sockets).
clients agent de transfert 1 serveur

banque

agent de transfert n

Le fonctionnement du systme comprendra deux phases : Initialisation : 1. cration du serveur. 2. cration dun client 3. le client demande au serveur des informations dont il a besoin pour son initialisation : nombre de comptes dans la banque et montant initial dpos sur un compte. 4. le serveur cre un thread pour traiter cette requte. 5. le thread envoie ces informations au client. 6. le client sinitialise et commence gnrer des demandes de transfert. Demande de transfert : 1. le client gnre et envoie une demande de transfert au serveur. 2. le serveur cre un thread pour traiter cette requte. 3. le thread traite la demande de transfert et renvoie le rsultat au client. 4. le client gnre une nouvelle demande, etc.

Systmes et applications rpartis

FIT 4 [INF443] 2011/12

TP 5 1/5

oprations bancaires avec sockets

2 Existant
Vous trouverez avec ce sujet une archive contenant un certain nombre de classes, compltes pour certaines et incompltes pour dautres. Les classes concernant linterface graphique sont situes dans le package gui, et elles sont toutes compltes : AgentTable, AgentTableModel, BankTable, BankTableModel : gestion des tables affichant respectivement lactivit des agents et les comptes bancaires. AgentFrame et BankFrame : gestion des fentres contenant les tables et les boutons de linterface graphique. Remarques : Eclipse va dtecter des erreurs dans certaines des classes fournies, ce qui est tout fait normal car elles utilisent des classes que vous devrez crire (et qui nexistent pas pour linstant). sauf si cela est explicitement demand, les champs et mthodes qui vous sont fournis ne doivent pas tre modifis, ils fonctionnent parfaitement.

3 Objets de communication
Pour grer la communication entre les clients et le serveur, nous allons utiliser des objets qui serviront de messages. Une classe InitMessage sera utilise lors de linitialisation des agents, et une classe TransferMessage sera utilise lors des demandes de transfert.

Exercice 1
Crez un package messages, et dfinissez-y une classe InitMessage. Cette classe doit contenir deux champs utiliss lors de linitialisation dun agent : int naccounts : le nombre de comptes dans la banque. double maxAmount : le montant initial de ces comptes, qui correspond au montant maximal dun transfert. La classe doit galement contenir des mthodes daccs pour ces deux champs : getNaccounts, setNaccounts, getMaxAmount et setMaxAmount. Remarque : les mthodes daccs peuvent tre gnres automatiquement par Eclipse en faisant un clic-droit dans le code source puis en slectionnant Source>Generate Getters and Setters, et en cochant les cases correspondant aux champs concerns.

Exercice 2
Dans le mme package, crez une classe TransferMessage. Cette classe doit contenir des donnes relatives la demande de transfert effectue par lagent, et des donnes relatives la rponse de la banque : demande : o int from : compte source. o int to : compte cible. o double amount : montant transfrer. rponse : o double available : montant disponible sur le compte source avant le transfert. o boolean done : indicateur de succs (indique si le transfert a pu tre effectu). L aussi, vous devez gnrer des mthodes daccs.

Exercice 3

Systmes et applications rpartis

FIT 4 [INF443] 2011/12

TP 5 2/5

oprations bancaires avec sockets

Ces deux classes sont destines tre transmise par flux. Quest-ce que cela implique ? Effectuez les transformations ncessaires.

4 Client : agent de transfert


Ct client, le comportement sera implment par trois classes contenues dans le package agent : AgentLauncher : o classe contenant le programme principal (classe fournie). Agent : classe charge de : o gnrer des demandes de transfert. o maintenir la liste de toutes les demandes ralises depuis la cration. AgentRunnable : classe charge de : o grer les connexions. o transfrer Agent les messages reus du serveur. o envoyer au serveur les messages gnrs par Agent. Aprs le lancement de AgentLauncher, une interface graphique est cre pour afficher lactivit de lagent. A la fin de son initialisation (mthode AgentFrame.AgentFrame()), la classe gui.AgentFrame cre aussi un thread, spcifiquement pour excuter AgentRunnable. Remarque : ce nouveau thread nest pas vraiment ncessaire, car on pourrait faire excuter le traitement de lagent par le thread initial. Mais lobjectif de ce TP est aussi de vous faire manipuler des threads, alors

Exercice 4
Crez la classe Agent, qui doit contenir trois champs : int naccounts : nombre de comptes de la banque, initialiser grce un message InitMessage. double maxAmount : montant maximal dun transfert, initialiser de la mme faon. Vector<TransferMessage> transfers : liste de tous les transferts demands par lagent, Vector initialiser lors de la construction. La classe doit galement contenir les mthodes suivantes : processInitMessage(InitMessage message) : utilise le message reu pour initialiser les champs naccounts et maxAmount. TransferMessage newTransferMessage() : gnre une nouvelle demande de transfert sous la forme dun message. Remarque : inspirez-vous de la mthode TransferRunnable.run du TP sur la synchronisation de threads. addTransfer(TransferMessage message) : rajoute une nouvelle demande de transfert (traite par le serveur) dans la liste de lagent. TransferMessage getTransfer(int index) : renvoie la ime demande de transfert prsente dans la liste (mthode utilise par linterface graphique). int getTransferNumber() : renvoie la longueur de la liste de demandes de transfert maintenue par lagent (mthode utilise par linterface graphique). Daprs-vous, combien de threads vont accder un objet Agent ? Sil y en a plusieurs, quelles sont les mthodes qui doivent tre synchronises, et pourquoi ?

Exercice 5
Compltez la classe AgentRunnable, qui doit contenir les mthodes suivantes : un constructeur. initAgent() : mthode devant :

Systmes et applications rpartis

FIT 4 [INF443] 2011/12

TP 5 3/5

oprations bancaires avec sockets

crer un socket vers le serveur. envoyer un InitMessage vide au serveur. rcuprer lInitMessage envoy en rponse par le serveur. transmettre ce message lagent avec Agent.processInitMessage, afin quil sinitialise. o fermer le socket. requestTransfer() : mthode devant : o ouvrir un socket vers le serveur. o gnrer une nouvelle demande de transfert avec Agent.newTransferMessage. o envoyer la demande au serveur. o rcuprer le TransferMessage envoy en rponse par le serveur. o demander lagent darchiver cette demande de transfert (traite par le serveur) avec Agent.addTransfer. o fermer le socket. Remarques : tous les champs ncessaires ainsi que la mthode run sont fournis. si vous voulez utiliser comme serveur une autre machine que lhte local au client, pensez modifier la constante IP.

o o o o

5 Serveur : banque
Ct serveur, le comportement sera implment par quatre classes contenues dans le package bank : BankLauncher : o classe contenant le programme principal (classe fournie). Bank : classe charge de : o rpondre aux requtes dinitialisation des agents. o traiter leurs demandes de transfert et envoyer une rponse. o maintenir les comptes bancaires. BankRunnable : classe charge de : o transfrer Bank les messages reus des clients. o envoyer aux clients les messages gnrs par Bank. MultiServerRunnable : classe permettant de grer plusieurs clients simultanment : o grer les connexions. o crer un nouveau thread excutant BankRunnable ds quun client soumet une requte. Aprs le lancement de BankLauncher, une interface graphique est cre pour afficher lactivit de la banque. Comme pour lagent, la classe gui.BankFrame cre un nouveau thread spcifiquement pour excuter MultiServerRunnable (mme remarque que pour lagent en ce qui concerne la ncessit de crer ce nouveau thread). Ensuite, la classe MultiServerRunnable ouvre le socket, et cre un nouveau thread pour chaque client se connectant (par contre, ces threads l sont absolument ncessaires). Chaque nouveau thread excute BankRunnable.

Exercice 6
Les champs de la classe Bank sont identiques ceux du TP sur la synchronisation des threads, de mme que le constructeur et les mthodes getBalance et getTotalBalance. Les autres mthodes sont les suivantes :

Systmes et applications rpartis

FIT 4 [INF443] 2011/12

TP 5 4/5

oprations bancaires avec sockets

: o extraits les donnes du message concernant le transfert effectuer. o effectue le transfert sil y a assez dargent. o complte les champs available et done du message. processInitMessage(InitMessage message) : complte les champs maxAmount et naccounts du message. Daprs-vous, combien de threads vont accder un objet Bank ? Sil y en a plusieurs, quelles sont les mthodes qui doivent tre synchronises, et pourquoi ?

processTransferMessage(TransferMessage message)

Exercice 7
Compltez la mthode run de BankRunnable, qui doit : crer les flux dentre/sortie grce au champ socket. lire un objet dans le flux et demander la banque de traiter cet objet : o avec Bank.processInitMessage si lobjet est un InitMessage. o avec Bank.processTransferMessage sil sagit dun TransferMessage. crire la rponse (le mme message, qui a t mis jour par la banque) dans le flux. fermer le socket.

Exercice 8
En vous inspirant du TP sur les sockets, crivez la mthode run de la classe MultiServerRunnable de manire ce quelle ouvre un socket et cre un nouveau thread pour chaque nouvelle requte reue. Ce thread devra excuter BankRunnable.

6 Test
Pour tester votre programme : lancez tout dabord le serveur avec BankLaunch. puis lancez un ou plusieurs clients avec AgentLaunch. les clients vont se mettre communiquer avec le serveur pour effectuer des transferts.

Remarques : si vous excutez le serveur et les clients sur la mme machine, utilisez lIP 127.0.0.1 dans AgentRunnable, sinon prcisez ladresse de lhte du serveur. si le programme se bloque avant que serveur et client ne communiquent, vrifiez que le serveur et les clients crent leurs flux dans des ordres contraires : o le serveur cre dabord le flux dentre puis le flux de sortie. o le client fait le contraire : dabord la sortie, puis lentre.

Systmes et applications rpartis

FIT 4 [INF443] 2011/12

TP 5 5/5