TP Noté 2012
Dans ce sujet, nous vous demandons, dans des exercices indépendants,
de réaliser différents clients et serveurs basés sur les travaux
pratiques précédents.
Commencez par créer un nouveau projet dans votre environnement Eclipse
que vous appellez tpnote-VotreNom. Créez aussi un
fichier readme.txt dans lequel vous mettez vos notes à
destination des correcteurs.
Le barème est donné à titre d'indication.
Les exercices sont progressifs et il est donc recommandé de les
réaliser dans l'ordre. Les exercices sont assortis de questions de
compréhension auxquelles vous devez répondre par écrit en mettant des
commentaires dans le code ou en complétant le
fichier readme.txt.
En fin de TP :
-
si ce n'est déjà fait, créez un fichier readme.txt dans
lequel vous mettez vos notes à destination des correcteurs ;
-
exportez votre projet Eclipse sous la forme d'une archive :
-
cliquez avec le bouton droit sur votre projet ;
-
puis, choisissez export ;
-
ensuite, dans general, choisissez archive ;
-
donnez le nom de l'archive. Eclipse complète le nom du fichier par le
suffixe .zip ;
-
cliquez sur finir ;
- télé-chargez le fichier sur moodle afin de fournir le résultat de
votre travail ;
- vérifiez avec l'enseignant présent dans la salle que le fichier
téléchargé est correct.
Ce TP est réalisé en plusieurs étapes. Pour
chacune, créez un paquetage portant le nom de l'étape.
1. Copie d'une partie de fichier (3 pts)
Pour cette étape, créez dans le paquetage partialcopy
un programme qui utilise un ByteBuffer.
Écrivez un programme qui reçoit en arguments :
-
le nom d'un fichier,
-
un entier qui décrit le rang du premier octet à copier dans le
fichier,
-
et un entier qui décrit le nombre d'octets à copier.
Ce programme copie les données correspondant aux arguments dans un
fichier appelé res.out.
Voici un exemple d'appel du programme :
java PartialCopy /etc/passwd 100 300
Expliquez les choix suivant relatifs aux ByteBuffer
:
-
combien en utilisez-vous et pourquoi ?
-
quel(s) type(s) utilisez-vous et pourquoi ?
-
quelle alternative avez-vous et pourquoi avez-vous préféré cette
implémentation ?
2. Transfert d'un fichier via UDP (6 pts)
Pour cette étape, créez le paquetage tftp qui
contiendra le client et le serveur.
2.1 Envoi d'un fichier via UDP (3 pts)
Dans cette étape, vous transmettez un fichier en envoyant des datagrammes.
Les datagrammes peuvent se perdre et leur ordre de réception peut être
différent de leur ordre d'émission. Par conséquent, chaque datagramme
doit contenir une entête avec :
- le nom du fichier,
- un entier long qui décrit le rang du
premier octet dans le fichier,
-
et un entier qui décrit le nombre
d'octets du fichier contenus dans ce datagramme.
Considérez que le serveur reçoit des datagrammes sur le
port 2020 plus votre numéro de machine. Écrivez le code
du client. Si vous voulez tester le code du client vous pouvez
utiliser le serveur réalisé en TP pour la réception de plusieurs
datagrammes :
MainNioRecvN.java.
Expliquez les opérations relatives aux ByteBuffer
:
-
quand et pourquoi utilisez-vous la méthode clear ?
-
quand et pourquoi utilisez-vous la méthode flip ?
-
l'utilisation d'un MappedByteBuffer peut-elle simplifer le
code ?
2.2 Réception d'un fichier via UDP (3 pts)
Dans cette étape, vous reconstituez un fichier à la réception de
datagrammes.
Les datagrammes tels que décrits précédemment sont reçus par votre
serveur.
Votre serveur reçoit des datagrammes sur le port 2020 plus
votre numéro de machine. Il copie les octets reçus dans un fichier
appelé comme le fichier initial mais avec le suffixe
« .copy ».
Écrivez le code du serveur.
Répondez à la question suivante :
-
à partir de quel moment dans le décodage du datagramme peut-on
envisager l'utilisation d'un
MappedByteBuffer pour l'accès au fichier ?
3. TFTP robuste (8 pts)
Réalisez dans un paquetage appelé robusttftp une
version du protocole précédent en ajoutant des acquittements. Pour
cela, nous utilisons au moins trois types de messages :
-
le message de type 1 contient le nom du fichier et la taille du
fichier. Il est utilisé pour débuter un envoi de fichier ;
-
le message de type 2 est identique au message utilisé dans les étapes précédentes et
contient le nom du fichier, le rang du premier octet, le nombre
d'octets et les octets transférés ;
-
le message de type 3 sert à acquiter les données reçues par le
serveur. Ces messages contiennent le nom du fichier et le rang du
dernier octet reçu séquentiellement depuis le début du fichier. Ainsi,
les messages du type 3 servent à informer le client de la
progression de la réception des données.
3.1 Partie serveur (4 pts)
Réalisez le serveur qui correspond au protocole de cette étape.
En réalisant le serveur, répondez aux questions suivantes :
-
expliquez le comportement standard du serveur lorsqu'il reçoit un
message qui est consécutif au message précédent.
-
proposez un comportement du serveur lorsqu'il reçoit un message dont
les données ne sont pas consécutives à celles reçues précédemment (il
y a un trou entre deux réceptions) ;
-
expliquez vos choix en matière de structures de données ou de
structure d'exécution pour permettre de réaliser le comportement que
vous avez décrit :
- quelles informations devez vous mémoriser sur le serveur ?
- quel comportement le serveur doit avoir en cas de trou dans la réception ?
3.2 Partie client (4 pts)
Réalisez le client qui correspond au protocole de cette étape.
En réalisant ce client, répondez aux questions suivantes :
-
comment émettre des messages et recevoir les acquittements sans être
bloqué ?
-
expliquez les solutions possibles et vos choix ?
4. TFTP robuste multiclients (3 pts)
Dans cette étape, le serveur accepte plusieurs
transferts simultanés en provenance de plusieurs clients.
Réalisez cette partie dans un paquetage
appelé robusttftpmulti.
En réalisant ce serveur, répondez aux questions suivantes :
-
comment gérez-vous plusieurs fichiers ouverts ?
-
proposez une structure de données pour permettre la gestion de
plusieurs clients ?
-
quel comportement doit avoir ce serveur pour tenter de garantir la
réception totale des fichiers ?
-
proposez une solution et implantez-la.