Client-serveur : implantation en Java d`un client POP

Transcription

Client-serveur : implantation en Java d`un client POP
Client-serveur : implantation en Java d'un client POP
POP (post-office protocol) est un protocole largement utilisé pour la récupération des e-mails sur les serveurs
de courrier. Pour dialoguer avec un serveur POP, un client se connecte sur le port 110 du serveur. Il peut alors
envoyer des commandes textuelles, qui sont suivies de réponses elles aussi textuelles.
Fonctionnement du protocole POP
Description générale
Le client fournit au serveur des commandes, terminées par un retour à la ligne. Une commande est composée
d'un nom de commande (USER, LIST, etc.), suivi éventuellement de paramètres séparés par des espaces.
Le serveur donne toujours une réponse à une commande. Une réponse positive commence par +OK, une
réponse négative commence par -ERR. Les réponses les plus simples tiennent sur une ligne, mais certaines
commandes comportent plusieurs lignes. Dans ce cas, la dernière ligne de la réponse est suivi d'un point (.)
seul sur une ligne.
Il y a deux phases principales dans un dialogue POP :
la phase d'authentification, au cours de laquelle le client fournit un nom d'utilisateur et le mot de passe
associé,
la phase de transaction, au cours de laquelle le client peut consulter la liste des messages, récupérer
des messages, supprimer des messages, etc.
Phase d'authentification
D'abord le client utilise la commande USER pour indiquer le nom d'utilisateur.
USER toto
Puis il donne le mot de passe associé (qui transite donc en clair...), à l'aide de la commande PASS.
PASS otot
À ce moment, la boîte à lettres est ouverte, et la connexion passe dans la phase de transaction.
Phase de transaction
Les commandes suivantes sont disponibles :
→ STAT : affiche des statistiques sur le nombre de messages et leur taille.
>>> STAT
<<< +OK <nombre de messages> <taille totale>
→ LIST : affiche la taille de chaque message.
>>>
<<<
<<<
<<<
<<<
<<<
LIST
+OK 3 messages (930 octets).
1 300
2 230
3 400
.
→ RETR : récupère un message par son numéro.
>>>
<<<
<<<
<<<
RETR <numéro>
+OK Message follows
Date: ...
...
<<< ...
<<< .
→ DELE : supprime un message par son numéro.
>>> DELE <numéro>
<<< +OK Message deleted
→ TOP : récupère les en-têtes (objet, date, expéditeur, etc.) d'un message donné par son numéro, plus un
nombre donné de lignes du corps du message.
>>>
<<<
<<<
<<<
<<<
TOP <numéro message> <nombre de lignes du corps>
+OK Message follows
Date: ...
...
.
→ QUIT : met fin à la connexion, et supprime effectivement les messages supprimés. Note : cette commande
est également disponible en phase d'authentification.
>>> QUIT
<<< +OK Bye.
Utilisation de POP à la main
Un serveur POP est à votre disposition pour le TD sur la machine si-linux.supelec.fr, port 1110. Il
accepte tous les noms d'utilisateurs, avec comme mot de passe le nom d'utilisateur lu de droite à gauche
(donc mot de passe « otot » pour l'utilisateur « toto », comme ci-dessus), et génère à chaque connexion
quelques e-mails « bidons ». Cependant, il fonctionne exactement comme un « vrai » serveur POP.
Pour commencer à vous familiariser avec le protocole POP, vous allez vous connecter manuellement sur ce
serveur. Pour cela, utilisez l'outil PuTTY, qui permet (entre autres) d'établir des connexions TCP. Il se trouve
dans Programmes > Programmation > PuTTY. Renseignez les champs indiqués sur la capture d'écran
suivante (« Raw » correspond à une simple connexion TCP), puis cliquez sur « Open ».
Vous serez alors connecté au serveur POP de test, qui vous donnera un message d'accueil. Vous devez alors
accomplir les tâches suivantes :
passer la phase d'authentification
récupérer la liste des messages
lire le message n°1 et le message n°2
supprimer les messages numéros 3 et 4
fermer la connexion
Création d'un programme Java d'accès à un serveur POP
On souhaite maintenant créer un programme Java qui se connecte au serveur POP utilisé ci-dessus, et
récupère les objets des messages contenus sur le serveur.
Question n°1 : création de la connexion grâce aux sockets
En utilisant les sockets Java, écrire un programme qui se connecte au serveur POP, crée les flux évolués
d'entrée/sortie, puis ferme proprement cette connexion.
Afin d'éviter de mettre des "try - catch" autour de toutes les opérations réseaux vous utiliserez un "throws
IOException" dans la fonction main pour rejeter toutes les exceptions liés aux réseau et aux IO sous la forme
d'un message d'erreur dans la console.
Votre fonction main devra commencer par : "public static void main(String arg[]) throws IOException {...}".
Il vous faudra aussi importer les packages : "java.lang.*", "java.net.*", "java.util.*" et "java.io.*".
Question n°2 : détection d'une erreur de dénomination du serveur POP
En cas d'erreur sur le nom du serveur visé (erreur de frappe de son nom par exemple) une exception de la
classe "UnknownHostException" sera levée (un type particulier d'IOException). La détection de cette
exception permettra de faire la différence avec un autre type d'erreur sur le réseau, et de faire un compte rendu
d'erreur précis.
Ajouter un "try - catch" (le seul du TD a priori) autour de la tentative de connexion au serveur, afin de détecter
et d'indiquer que le serveur visé est inconnu, puis d'arrêter le client par un "System.exit(1)".
Testez le fonctionnement de votre programme avec et sans erreur sur le nom du serveur visé.
Question n°3 : lecture des messages du serveur et envoi d'une commande
Après l'établissement de la connexion, le serveur envoie un message de confirmation, appelé « bannière », du
type :
+OK SI-POP server ready.
Lisez ce message à partir du flux d'entrée de la socket, et affichez-le à l'écran.
Envoyez ensuite la commande QUIT au serveur de façon à fermer proprement la connexion. Lisez la réponse
et affichez-la.
Question n°4 : authentification
Ajoutez à votre programme la gestion de la phase d'authentification : il doit s'authentifier au serveur avec un
certain nom d'utilisateur, et le mot de passe associé. Affichez les réponses du serveur à chaque étape.
Question n°5 : récupération de la liste de tous les messages
Après l'authentification, votre programme doit maintenant demander au serveur la liste des messages et leurs
tailles, et l'afficher à l'écran
Question n°6 : récupération des sujets de tous les messages
Modifier le programme obtenu précédemment pour qu'en plus de la taille de chaque message, il affiche son
objet.
Pour aller plus loin
Vous pouvez utiliser votre programme pour lire vos messages sur de « vrais » serveurs POP, par exemple celui
de Supélec. Il n'y a qu'une petite modification à apporter : les commandes émises doivent se terminer par les
caractères « CR » et « LF » ('\r' et '\n'), ce qui n'est pas le cas par défaut en Java. Vous devez donc
obligatoirement ajouter l'instruction suivante en début de programme :
System.setProperty("line.separator", "\r\n");
Le protocole POP est normalisé par le document [RFC 1939] de l'IETF (Internet Engineering Task Force)
datant de 1996.
Documentation Moodle pour cette page
Connecté sous le nom « Stéphane Vialle » (Déconnexion)
TC2A_SINF
Validate HTML
Section 508 Check
WCAG 1 (2,3) Check

Documents pareils