Proposition de protocole ======================== Proposition de protocole pour la communication inter-serveurs/clients pour le projet de chat textuel. Quelques règles pour assurer le bon fonctionnement du protocole : - Chaque ligne se termine par les caractères `\r\n`. - Un nom d’utilisateur ne peut contenir que des caractères alphanumériques (a-z, A-Z, 0-9). - Un nom d’utilisateur contient de 1 (un) à 20 (vingt) caractères. - Un message contient de 1 (un) à 2000 (deux mille) caractères (hors protocole) Liste d’abbréviations : - "C" : client unique - "A" : ensemble des clients - "S" : serveur Général ------- ### Requête 0.1 S->C Requête non comprise par le serveur ``` text BAD REQ ``` Connexion au serveur -------------------- Gestion de l’arrivée des utilisateurs sur le serveur (choix du nom d’utilisateur et notification des clients). ### Requête 1.1 C->S Connexion sans nom d’utilisateur fournit par le client, `` devant être remplacé par la version utilisée par le client (tel que `0.5` ou `1.0`). ``` text PROT CONNECT NEW ``` ### Requête 1.2 C->S Connexion au serveur mentionnant le nom d’utilisateur ``` text PROT CONNECT USER ``` Selon si la connexion est établie avec ce nom d'utilisateur, la [requête 1.4](#requête-14) ou la [requête 1.5](#requête-15) sera renvoyée. Si la requête [requête 1.5](#requête-15) est renvoyée, la [requête 1.2](#requête-12) suivra immédiatement après. ### Requête 1.3 S->C Réponse à cette requête du serveur vers le client (serveur vers client), requête du nom d'utilisateur. ``` text NAME REQ ``` ### Requête 1.4 C->S Réponse à la requête du serveur (client vers serveur), envoi du nom d’utilisateur. ``` text NAME ``` ### Requête 1.5 S->C Réponse du serveur si l'enregistrement du nom d'utilisateur s’est bien déroulé, immédiatement suivi par la [requête 1.9](#requête-18) ``` text NAME OK ``` ### Requête 1.6 S->C Réponse du serveur si l'enregistrement du nom d'utilisateur a rencontré une erreur (nom déjà utilisé,…) (serveur vers client). ``` text NAME FAILURE ``` ### Requête 1.7 S->A Conjointement à la [requête 1.4](#requête-14), cette requête sera envoyée à tout autre client connecté pour les notifier de la connexion d’un nouvel utilisateur. ``` text JOIN ``` ### Requête 1.8 S->C Requête confirmant au client sa connexion ``` text WELCOME ``` ### Requête 1.9 S->C Réponse du serveur en cas de version de protocole différente ```text BAD PROT ``` Déconnexion du serveur ---------------------- Gestion du départ des utilisateurs du serveur ### Requête 2.1 C->S S->C Du client vers le serveur : notification de déconnexion du client au serveur. Du serveur vers le client : confirmation de déconnexion du client depuis le serveur. ``` text BYE ``` ### Requête 2.2 S->A Notification aux clients de la déconnexion d’un autre client. ``` text LOGOUT ``` Ping ---- Vérification de la connexion des clients avec le serveur. Chaque minute, la requête [requête 3.1](#requête-31) est envoyée à chaque client qui ont tous trois secondes pour répondre avec la [requête 3.2](#requête-32). ### Requête 3.1 S->A, C->S Envoi d’un ping du serveur vers chaque client ou d’un client vers le serveur. ``` text PING ``` ### Requête 3.2 C->S, S->C Envoi de la réponse du client au serveur ou du serveurs au client pour la [requête 3.1](#requête-31) ``` text PONG ``` ## Échange de messages ### Échange de messages publics #### Requête 4.1.1 C->S Envoi depuis le client vers le serveur d’un message public ``` text MSG ``` #### Requête 4.1.2 S->A Transmission d’un message d’un client vers les autres clients ``` text FROM MSG ``` ### Interactions salon de chat #### Requête 4.2.1 C->S Demande du client pour recevoir la liste des participants connectés ```text REQ CLIENTS ``` #### Requête 4.2.2 S->C Réponse du client à la [requête 4.2.1](#requête-421) transmettant au client la liste des autres clients connectés ```text LIST CLIENTS ``` Comme mentionné au début de ce document, aucun caractère blanc n’est autorisé dans les pseudonymes afin qu’il n’y ait pas de collision avec le protocole.