Ali Bouhjra 27/01/2024
Ce projet, codé dans le cadre du cours de system repartie, a pour but de se connecter a un serveur ftp distant (e.g. "ftp.ubuntu.com") et de lister en profondeur tous ses répertoires.
Pour ce faire, il suffit de taper la commande java -jar .\target\SR1TreeFtp-1.0-SNAPSHOT.jar suivi d'un nom de domaine ou d'une ip valide. Il est possible d'ajouter optionnellement la profondeur que l'on veut explorer.
Pour afficher par exemple le dossier racine du serveur ftp.ubuntu.com la commande est la suivante :
.\target\SR1TreeFtp-1.0-SNAPSHOT.jar ftp.ubuntu.com 0Suite à cette commande, une identification sera requise. Dans le cas où l'identification auprès du serveur échouerait, la connexion se fera en mode anonyme. Finalement, le programme affichera les dossiers et leurs contenus dans la sortie standard.
L'architecture de ce projet est très simple, elle est décomposée en deux classes :
-
Serveur : classe qui contient toutes les méthodes pour interagir avec le serveur FTP distant, envoyer des commandes, écouter les réponses, lister les répertoires.
-
FTPclient : la classe principale qui appelle les méthodes de la classe serveur dans le main.
Ceci est l'essentiel de l'architecture auquel sont ajoutées les classes exceptions et tests unitaires.
méthode récursive qui affiche les répertoires en profondeur.
void listDirectories(Server dataserver, String currentDirectory) throws IOException, ServerConnectionException {
if (profondeur > profondeurMax) {
return;
}
profondeur++;
String response;
//ecoute la reponse de LIST sur le data server
while ((response = dataserver.receiveResponse()) != null) {
//affichage en arbre
for (int i = 0; i < profondeur; i++) System.out.print(" ");
System.out.print("|");
for (int i = 0; i < profondeur; i++) System.out.print("_");
//extraction du nom du repertoire ou fichier de la reponse
String directoryName = response.substring(response.lastIndexOf(" ") + 1);
//affichage du nom
System.out.println(directoryName);
//test si nous sommes sur un repertoire
if (response.startsWith("d")) {
//list le contenu de ce repertoire et renvois le serveur a ecouter
Server dataServer2 = changeWorkingDirectoryAndList(currentDirectory + directoryName + "/");
//appel recursif pour afficher le contenu reçu
if (dataServer2 != null) listDirectories(dataServer2, currentDirectory + directoryName + "/");
}
}
dataserver.disconnect();
profondeur--;
}