Gestion Distribuée (Par Sockets) de Banque en Java
Gestion Distribuée (Par Sockets) de Banque en Java
Gestion Distribuée (Par Sockets) de Banque en Java
1
2 Gestion distribuée (par sockets) de banque en Java
Pour réaliser l’objectif visé, on se fondera sur l’exercice de gestion bancaire en local.
On représentera un paquet par une classe décrite ci-dessous.
/* Operations */
public static final int OPEN = 1; // Ouverture de compte
public static final int CLOSE = 2; // Fermeture de compte
public static final int DEPOSIT = 3; // Depot sur un compte
public static final int WITHDRAW = 4; // Retrait sur un compte
public static final int BALANCE = 5; // Solde d’un compte
public static final int QUIT = 6; // Sortie du programme
/* Erreurs */
public static final int TRANSOK = 0; // Transaction bien passee
public static final int EXISTANT = -1; // Overture de compte deja existant
public static final int NONEXISTANT = -2; // Operation sur compte inexistant
public static final int INVPASSWORD = -3; // Mot de passe invalide
public static final int NEGBALANCE = -4; // Solde insuffisant pour retrait
Outre les champs name, password et amount qu’on trouvait déja en solution locale, nous
ajoutons un champ entier operation représentant le type d’opération bancaire à réaliser.
Les différents types d’opérations possibles sont listés en constantes (public static
final int) strictement positives. Les erreurs de type bancaire pouvant survenir sont
représentées par des constantes strictement négatives et une constante nulle (TRANSOK)
signifie une transaction qui s’est bien passée.
Considérons un paquet ayant les champs suivants : name valant "Diogene", password
valant "tonneau" et amount valant 1. Supposons que le compte a été ouvert et que l’on
veuille déposer (DEPOSIT) un montant de 100 sur le compte. Pour transmettre le paquet,
on le transforme en la chaîne de caractères formée en mettant bout à bout les champs,
séparés par le caractère : (deux-points). Ceci donne pour l’exemple ci-dessus
"Diogene:3:tonneau:100#". Le deuxième champ est la valeur de la constante associée
4 Gestion distribuée (par sockets) de banque en Java
}// BankServerSocket
On distingue trois champs : outre le numéro de port par défaut et la table des comptes
(déja présente dans la solution locale et qui réalise la correspondance nom/objet de type
Account), on dispose d’un champ entier qui code l’apparition d’une erreur. On rap-
pelle à ce propos que les constantes de la classe BankSocketPacket sont statiques et
doivent donc être appelées en plaçant le nom de la classe devant ; par exemple la constante
BankSocketPacket.TRANSOK désigne une transaction qui s’est bien passée.
Dans les différentes méthodes que l’on trouvait déja dans la solution locale, le traite-
ment d’erreurs effectué par un traitement d’exception de type BankingException est
remplacé par l’affectation de transCode au code de l’erreur correspondante. Les deux
seules méthodes nouvelles sont sendPacket() et receivePacket() pour l’envoi et la
réception des packets. Plus précisément, une fois le paquet à envoyer créé (par un new
BankSocketPacket(...)), sendPacket() est chargée des opérations suivantes :
– emballage du paquet, c.à.d. création à l’aide de la méthode foldPacket() (mé-
thode de la classe BankSocketPacket) d’une chaîne du type
"name:OPERATION:password:amount#" ;
– envoi de cette chaîne au client via la méthode println() de la classe PrintStream.
De son coté, receivePacket() est chargée des opérations suivantes :
– Réception d’une requête via la méthode readLine().
– Création d’un paquet “vide” (par le constructeur par défaut de BankSocketPacket).
– Déballage du paquet par appel de la méthode unfoldPacket().
Enfin, la méthode main(), outre les traitements classiques, effectuera les actions sui-
vantes au sein de son service :
– Appel de receivePacket().
– Branchement selon l’opération demandée selon un switch.
– Appel de la méthode correspondant à l’opération demandée (c’est-à-dire : openAccount(),
closeAccount(), deposit(), withdraw(), getBalance() ou, dans le cas de
sortie, des close() de sockets).
– Création d’un paquet avec les champs adéquats.
6 Gestion distribuée (par sockets) de banque en Java
Les méthodes getName() et getPassword() sont des méthodes de saisie qui de-
mandent respectivement à l’utilisateur d’entrer sur l’entrée standard (au clavier) un nom et
un mot de passe ; la chaîne de caractère entrée est renvoyée. La méthode treatError()
affiche un message sur la sortie standard correspondant au code d’erreur fourni en para-
mètre. La méthode sendReceive() effectue les actions suivantes :
– Emballage du paquet toSend par la méthode foldPacket() (1er paramètre).
– Envoi du paquet emballé par println() sur sout (2e paramètre, représentera le
flux de sortie vers le serveur dans le code qui appelle la méthode).
– Réception d’une ligne par readLine() sur sin (3e paramètre, représentera le flux
d’entrée en provenance du serveur dans le code qui appelle la méthode).
– Déballage de la ligne reçue par unfoldPacket() après création d’un paquet via
le constructeur par défaut de BankSocketPacket.
– Test sur le code (champ operation) du paquet juste déballé : s’il est égal au code
BankSocketPacket.TRANSOK, affichage du message message, sinon appel de la
méthode treatError() avec pour argument ce code.
– Renvoi (return()) du paquet déballé.
Au sein de la méthode main(), outre les traitements usuels pour un programme client
par sockets, le traitement du service comprend :
– Affichage des différentes opérations possibles et prise d’entrée (choix) de l’utilisateur
– Choix selon l’opération souhaitée. Puis, au moins :
– prise des nom et mot de passe via getName() et getPassword() ;
– création d’un paquet par le constructeur de BankSocketPacket en y mettant les
noms, mot de passe et opération sélectionnés ;
Exercice 3 – Élaboration du client 7