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