Développer une application réseau en Java de A à Z


précédentsommairesuivant

II. Protocole

Nous allons ici détailler le protocole utilisé.

II-A. Introduction

On appelle serveur l'hôte fournissant le service, et client l'hôte l'utilisant. Le Protocole PCU fournit un service de discussion instantanée et de mise en relation entre clients, construit sur le protocole TCP/IP, il est volontairement écrit entièrement en français. Il s'organise autour de deux fonctionnalités principales :

  • les discussions plusieurs-à-plusieurs, par canaux ;
  • les discussions un-à-un, en connexion directe, qui prend également en charge les transferts de fichiers.

Un canal est un groupe nommé d'un ou plusieurs clients qui recevront tous les messages adressés à ce canal. On appelle connexion directe une connexion entre deux clients ne passant pas par le serveur.

II-B. Spécifications

II-B-1. Généralités

Pour être indépendant de tout langage, PCU est un protocole pur texte, et afin d'être compatible avec la majeure partie des caractères existant l'encodage utilisé est UTF-8.

II-B-2. Messages

Les messages échangés utilisent :

  • SP (0x20) et CR (0x0D) comme séparateur ;
  • CRLF (0x0D, 0x0A) comme séquence de terminaison ;
  • LF (0x0A) comme caractère de fin de ligne.

Les réponses du serveur doivent permettre au client de savoir à quel message il répond. Si un client fait une demande du nombre de connectés, des réponses simples comme +OK_REQUETE ou -ERR_ERREUR seront renvoyées par le serveur.

II-B-3. Conventions

Le nom des commandes est volontairement long de façon à être le plus explicite possible. Le format des commandes est défini ci-dessous.

Convention des réponses :

  • + préfixe une réponse n'étant pas une erreur et est suivi de :
    • OK pour une réponse positive.
    • KO pour une réponse négative.
  • - préfixe une erreur et est toujours suivi de ERR

II-B-4. Format des messages en pseudo-BNF

Format des messages émis par le client :

  • REQUETE ::= <COMMANDE><sp> | <cr>[<PARAMS>]<crlf>
  • COMMANDE ::= un message
  • PARAMS ::= chaîne UTF-8 séparée par des SP

Format des messages émis par le serveur :

  • REPONSE ::= <PREFIXE> <TEXTE><crlf>
  • PREFIXE ::= (+<SUCCES> | -<ERREUR> | Image non disponible)
  • SUCCES ::= (OK|KO)_<COMMANDE>
  • ERREUR ::= chaîne alphabétique en majuscules, sans espaces, préfixée par ERR_
  • TEXTE ::= chaîne alphabétique

II-C. Etats

II-C-1. Non authentifié

Etat de la connexion client/serveur avant la réussite de l'authentification du client.

II-C-2. Authentifié

Etat de la connexion après la réussite de l'authentification.

II-C-3. Connecté à un canal

État de la connexion client/serveur après la connexion à un canal.

II-C-4. Connexion directe

Etat de la connexion client/client une fois la connexion directe acceptée par les deux parties.

II-D. Messages

Si un client envoie un message incorrect, c'est-à-dire que les arguments ne correspondent pas à la commande, le serveur lui répond par -ERR_SYNTAXE. Si la commande est inconnue: -ERR_CMDINCONNUE. Si la commande ne peut être invoquée avec l'état courant du client : -ERR_ETAT.

II-D-1. Enregistrement de la connexion

II-D-1-a. IDENTIFIER

  • Synopsis :
    • IDENTIFIER <login> <mot de passe>
  • Contraintes :
    • Ce message ne peut être émis que dans un état Non authentifié.
  • Description :
    • Le client utilise cette commande pour s'identifier, il passe ainsi dans un état Authentifié. Si l'authentification a réussie le serveur précise son login et ses droits (admin ou nonadmin).
  • Réponses possibles :
    • L'authentification a réussie :
      • +OK_IDENTIFIER <login> <droits>
    • Le login ou le mot de passe est incorrect :
      • -ERR_ECHECIDENT <login>
    • Le serveur ne peut pas répondre à cette requête à cause d'un problème interne :
      • -ERR_INTERNE

II-D-1-b. QUITTER

  • Synopsis :
    • QUITTER [<message de départ>]
  • Contraintes :
    • Ce message ne peut être émis que dans un état Authentifié.
  • Description :
    • Commande utilisée par le client pour fermer la connexion.
  • Réponses possibles :
    • Aucune

II-D-1-c. FINCONNEXION

  • Synopsis :
    • FINCONNEXION ["<message de départ>"]
  • Contraintes :
    • Message envoyé par le serveur pour prévenir le client de la fin de la connexion lorsque le serveur est stoppé ou relancé, lorsque le nombre maximum de connexions est atteint et enfin lorsq'un client est banni. Il est possible de préciser un message de fin.
  • Réponses possibles :
    • Aucune

II-D-2. Opérations sur les canaux

II-D-2-a. REJOINDRE

  • Synopsis :
    • REJOINDRE <nom-canal>
  • Contraintes :
    • Ce message ne peut être émis que dans un état Authentifié.
  • Description :
    • Commande utilisée pour rejoindre un canal.
  • Réponses possibles :
    • Le canal a bien été rejoint :
      • +OK_REJOINDRE <nom-canal>
    • Le client est déjà connecté :
      • -ERR_DEJACONNECTE <nom-canal>
    • Le canal n'existe pas :
      • -ERR_CANALINTROUVABLE <nom-canal>

II-D-2-b. MESSAGE

  • Synopsis :
    • MESSAGE <nom-canal> <texte>
  • Contraintes :
    • Ce message ne peut être émis que dans un état Authentifié et Connecté à un canal.
  • Description :
    • Commande utilisée pour envoyer un message sur un canal.
  • Réponses possibles :
    • Le message a bien été envoyé :
      • +OK_MESSAGE <nom-canal>
    • L'utilisateur n'est pas connecté au canal précisé :
      • -ERR_NONCONNECTE <nom-canal>
    • Le canal n'existe pas :
      • -ERR_CANALINTROUVABLE <nom-canal>

II-D-2-c. MEMBRE

  • Synopsis :
    • MEMBRE <nom-canal>
  • Contraintes :
    • Ce message ne peut être émis que dans un état Authentifié.
  • Description :
    • Commande utilisée pour connaître la liste des connectés au canal.
  • Réponses possibles :
    • Les utilisateurs ont été trouvés :
      • +OK_MEMBRE <nom-canal><CR><login1 login2 ... loginN>
    • Le canal n'existe pas :
      • -ERR_CANALINTROUVABLE <nom-canal>

II-D-2-d. QUITTERCANAL

  • Synopsis :
    • QUITTERCANAL <nom-canal>
  • Contraintes :
    • Ce message ne peut être émis que dans un état Authentifié et Connecté à un canal.
  • Description :
    • Commande utilisée pour quitter un canal.
  • Réponses possibles :
    • La déconnexion au canal s'est bien passée :
      • +OK_QUITTERCANAL <nom-canal>
    • L'utilisateur n'est pas connecté au canal précisé :
      • -ERR_NONCONNECTE <nom-canal>
    • Le canal n'exsite pas :
      • -ERR_CANALINTROUVABLE <nom-canal>

II-D-2-e. NOTIFIER

  • Synopsis :
    • NOTIFIER <nom-canal> <evenement> ([<login>] | [<login>] ["<texte>"] | ["<texte>"])
  • Contraintes :
    • Aucunes, ce message est envoyé par le serveur.
  • Description :
    • Ce message est envoyé par le serveur aux clients connectés à un canal pour les notifier d'un évènement affectant le canal.
  • Il y a six évènements possibles :
    • REJOINT <login>
    • PARLE <login> "<texte>"
    • PARTI <login>
    • EJECTE <login>
    • SUJETCHANGE "<texte>"
    • SUPPRIME
    • BANNI <login>

II-D-3. Connexion directe

II-D-3-a. CONNEXIONDIRECTE

  • Synopsis :
    • CONNEXIONDIRECTE <login> <IP>
  • Contraintes :
    • Ce message ne peut être émis que dans un état Authentifié.
  • Description :
    • Commande utilisée par un client A pour demander une connexion directe à un autre client B. Le serveur sert d'intermédiaire, et permet aux deux clients de s'échanger les informations nécessaires comme leurs adresses IP respectives, et le port sur lequel la connexion doit se faire. On distingue quatre étapes :
  • A passe par le serveur pour demander une connexion directe à B: CONNEXIONDIRECTE login-B IP-A.
  • Le serveur transmet le message à B en substituant son login par celui de A. B reçoit : CONNEXIONDIRECTE login-A ip-A.
  • B se prépare à accueillir une connexion sur un port de son choix et envoie au serveur : +OK_CONNEXIONDIRECTE IP-B port-B qui le transmet tel quel à A et passe alors dans l'état connexion directe.
  • A se connecte à IP-B:port-B et passe alors dans l'état connexion directe. Cette séquence peut échouer à l'étape 1 si le login n'est pas reconnu, le serveur répond alors -ERR_LOGININTROUVABLE login-A. B peut également refuser la connexion directe, il répond alors +KO_CONNEXIONDIRECTE login-A.
  • Réponses possibles de la part du serveur :
    • Le login est introuvable :
      • -ERR_LOGININTROUVABLE <login>
  • Réponses possibles de la part de B :
    • Confirmation de la connexion directe. Avant l'envoi de cette réponse, il se met en écoute :
      • +OK_CONNEXIONDIRECTE <IP> <port>
    • Refus de la connexion :
      • +KO_CONNEXIONDIRECTE <login>

II-D-3-b. MESSAGEPRIVE

  • Synopsis :
    • MESSAGEPRIVE <texte>
  • Contraintes :
    • Ce message ne peut être émis que dans un état Connexion directe.
  • Description :
    • Commande utilisée dans le cadre d'une connexion client/client pour envoyer un message.

II-D-3-c. TRANSFERTFICHIER

  • Synopsis :
    • TRANSFERTFICHIER <nom-fichier>
  • Contraintes :
    • Ce message ne peut être émis que dans un état Connexion directe.
  • Description :
    • Cette commande est utilisée pour demander un transfert de fichier. Le client qui propose le transfert précise le nom du fichier. Le receveur lui, précise le port sur lequel il attend la connexion si le transfert est accepté.
  • Réponses possibles :
    • Transfert accepté :
      • +OK_TRANSFERTFICHIER <port>
    • Transfert refusé :
      • +KO_TRANFERTFICHIER

II-D-4. Informations

II-D-4-a. LISTER

  • Synopsis :
    • LISTER [<nom-canal>]
  • Contraintes :
    • Ce message ne peut être émis que dans un état Authentifié.
  • Description :
    • Commande utilisée pour connaître la liste des canaux du serveur. Le serveur répond par une liste de triplés <nom-canal> <topic> <nombre d'utilisateurs> séparés par CR. Si le nom d'un canal est précisé celle-ci ne s'effectue que sur ce dernier c'est-à-dire que le serveur répond par le triplé <nom-canal> <topic> <nombre d'utilisateurs>
  • Réponses possibles :
    • La liste a été trouvée :
      • +OK_LISTER<CR>triplet1<CR>triplet2<CR>...<CR>tripletN
    • Si le nom du canal a été précisé et que celui-ci n'existe pas :
      • -ERR_CANALINTROUVABLE <nom-canal>

II-D-4-b. INFOMEMBRE

  • Synopsis :
    • INFOMEMBRE <login>
  • Contraintes :
    • Ce message ne peut être émis que dans un état Authentifié.
  • Description :
    • Commande utilisée pour connaître les informations relatives à un utilisateur.
  • Réponses possibles :
    • L'utilisateur a été trouvé :
      • +OK_INFOMEMBRE <login><CR>nom-canal1 ... nom-canalN
    • L'utilisateur n'a pas été trouvé :
      • -ERR_LOGININTROUVABLE <login>

II-D-4-c. MOTD

  • Synopsis :
    • MOTD
  • Contraintes :
    • Aucunes.
  • Description :
    • Commande utilisée pour connaître le MOTD (Message Of The Day) du serveur.
  • Réponses possibles :
    • Le message est trouvé :
      • +OK_MOTD "<motd>"
    • Une erreur interne est survenue :
      • -ERR_INTERNE

II-D-5. Administration

Ces commandes sont réservées à l'administrateur. Tout utilisateur non privilégié qui tenterait d'utiliser ces commandes reçoit le message d'erreur -ERR_NONADMINISTRATEUR.

II-D-5-a. CNL_CREER

  • Synopsis :
    • CNL_CREER <nom-canal> "<sujet-canal>"
  • Contraintes :
    • Ce message ne peut être émis que dans un état Authentifié.
  • Description :
    • Création d'un canal.
  • Réponses possibles :
    • Le canal a bien été créé :
      • +OK_CNL_CREER <nom-canal> "<sujet-canal>"
    • Le canal existe déjà :
      • -ERR_CANALEXISTANT <nom-canal>
    • Trop de canaux ont déjà été créés :
      • -ERR_NBCANAUXMAX

II-D-5-b. CNL_SUPPRIMER

  • Synopsis :
    • CNL_SUPPRIMER <nom-canal>
  • Contraintes :
    • Ce message ne peut être émis que dans un état Authentifié.
  • Description :
    • Suppression d'un canal.
  • Réponses possibles :
    • Le canal a bien été supprimé :
      • +OK_CNL_SUPPRIMER <nom-canal>
    • Le canal passé en argument n'existe pas :
      • -ERR_CANALINTROUVABLE <nom-canal>

II-D-5-c. CNL_CHANGERSUJET

  • Synopsis :
    • CNL_CHANGERSUJET <nom-canal> "<nouveau-sujet>"
  • Contraintes :
    • Ce message ne peut être émis que dans un état Authentifié.
  • Description :
    • Commande utilisée pour changer le sujet d'un canal.
  • Réponses possibles :
    • Le sujet du canal a bien été changé :
      • +OK_CNL_CHANGERSUJET <nom-canal> "<nouveau-sujet>"
    • Le canal passé en argument n'existe pas :
      • -ERR_CANALINTROUVABLE <nom-canal>
    • Le sujet n'est pas valide :
      • -ERR_SUJETINCORRECT "<nouveau sujet>"

II-D-5-d. UTL_EJECTER

  • Synopsis :
    • UTL_EJECTER <login> <nom-canal>
  • Contraintes :
    • Ce message ne peut être émis que dans un état Authentifié.
  • Description :
    • Commande utilisée pour éjecter un utilisateur d'un canal.
  • Réponses possibles :
    • L'utilisateur a été éjecté :
      • +OK_UTL_EJECTER <login> <nom-canal>
    • L'utilisateur n'a pas été trouvé sur le serveur :
      • -ERR_LOGININTROUVABLE <login>
    • L'utilisateur n'est pas connecté au canal :
      • -ERR_NONCONNECTE <login> <nom-canal>
    • Le canal n'existe pas :
      • -ERR_CANALINTROUVABLE <nom-canal>

II-D-5-e. UTL_BANNIR

  • Synopsis :
    • UTL_BANNIR <login>
  • Contraintes :
    • Ce message ne peut être émis que dans un état Authentifié.
  • Description :
    • Commande utilisée pour bannir un utilisateur du serveur.
  • Réponses possibles :
    • L'utilisateur a été banni :
      • +OK_UTL_BANNIR <login>
    • L'utilisateur n'a pas été trouvé sur le serveur :
      • -ERR_LOGININTROUVABLE <login>

II-D-5-f. SRV_RELANCER

  • Synopsis :
    • SRV_RELANCER [<message>]
  • Contraintes :
    • Ce message ne peut être émis que dans un état Authentifié.
  • Description :
    • Relance le serveur. Il est possible de préciser un message de notification à l'attention des clients.
  • Réponses possibles :
    • Le serveur va se relancer :
      • FINCONNEXION [<message>]

II-D-5-g. SRV_STOPPER

  • Synopsis :
    • SRV_STOPPER [<message>]
  • Contraintes :
    • Ce message ne peut être émis que dans un état Authentifié.
  • Description :
    • Arrête le serveur. Il est possible de préciser un message de notification à l'attention des clients.
  • Réponses possibles :
    • Le serveur va s'arrêter :
      • FINCONNEXION [<message>]

II-D-5-h. SRV_LISTER

  • Synopsis :
    • SRV_LISTER
  • Contraintes :
    • Ce message ne peut être émis que dans un état Authentifié.
  • Description :
    • Liste toutes les connexions du serveur. Le serveur répond par une liste de couple <login> <IP> séparés par des CR.
  • Réponses possibles :
    • La liste a été trouvée :
      • +OK_SRV_LISTER <CR>liste-connexion

précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2010-2013 Julien Plu. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.