CHIRC / IRC
Transcription
CHIRC / IRC
Université de CAEN Campus II UFR Sciences Département d’Informatique Master 1 Informatique PROJET DE PROGRAMMATION AVANCEE DES SYSTEMES ET DES RESEAUX UE 10 « SALON DE DISCUSSION » - CHIRC / CHATIRC - AUBRUN Thibaut LION Thomas MAUDOUIT Ludovic VIARD Philippe Responsable de Projet : M. MADELEINE Jacques Rapport de Projet soutenu Mai/Juin 2005 SOMMAIRE INTRODUCTION 2 I. 3 II. ARGUMENTATION DE NOS CHOIX 1. Généralités 3 2. Nos fichiers 4 3. Nos commandes 6 DEFINITION DES PROTOCOLES PROTOCOLES - RFC 7 1. Introduction 8 2. Le modèle 8 3. Les procédures 8 4. Les spécifications 11 5. Le glossaire 11 III. EXEMPLES DE SCENARII D’UTILISATION 13 CONCLUSION 17 1 INTRODUCTION NTRODUCTION Le but du devoir est de réaliser une application de type « salon de discussion » (chatroom). Cette application comportera plusieurs programmes communiquant via un réseau. Un utilisateur pourra « entrer » dans un salon de discussion et y communiquer avec les autres utilisateurs présents. Dans le salon, les discussions seront publiques. Toutefois, les utilisateurs auront aussi la possibilité de créer des conversations privées. Une conversation fait intervenir au moins deux utilisateurs. Il n’y a pas de maximum théorique au nombre d’utilisateurs (il peut évidemment y avoir un maximum technique). Un utilisateur pourra participer à plusieurs conversations simultanément. La création d’une conversation privée et la participation d’un utilisateur à une telle conversation seront régies par des règles précises qu’il vous incombe de décrire. Dans une version plus avancée, plusieurs salons, géographiquement distribués, pourront se regrouper pour permettre à un utilisateur de participer aux conversations qui y ont lieu. 2 I. ARGUMENTATION DE NOS CHOIX 1. Généralités Notre projet a été effectué premièrement en Java. Nous avons décidé de le réaliser également en C++. • Afin de rendre compatible notre programme dans divers langage nous avons interfacé la partie réseau de notre projet en Corba. Tout ce qui concerne Corba se trouve dans les fichiers : ChatRoomImpl.java et ChatUserImpl.java. • L’IDL définie les interfaces ChatRoom et ChatUser. Nous utilisons les options de compilation de l’IDL : -fallTIE -oldImplBase afin de créer des objets « TIE ». Cela remplace le PAO et facilite l’utilisation de l’IDL. Nous ne sommes en effet pas obliger de créer une classe Servant et nous pouvons instancier nos classes par l’intermédiaire des objets « TIE ». Voici à quoi ressemble notre IDL : module app{ typedef sequence<wstring> SeqString; interface ChatUser { void put(in wstring msg, in wstring salon); wstring getPseudo(); void setTabUsers(); wstring getSalonActif(); void askMeToCreateMP(in wstring avecqui, in wstring nomMp); void setSalon(); }; interface ChatRoom { void post(in wstring msg,in wstring pseudo, in wstring salon); boolean subscribe(in ChatUser u, in wstring pseudo); void unsubscribe(in wstring pseudo); wstring getUsers(in long index, in wstring pseudo); wstring getSalon(in long i, in wstring pseudo); boolean connectSalon(in wstring salon,in wstring pseudo); void pleaseCreateMP(in wstring avecqui, in wstring dequi, in wstring nomMp); boolean isHere(in wstring salon, in wstring pseudo); }; }; • Pour le service de nommage on utilise ORBD, notre programme fonctionne également sous OMNI mais on ne s’est servi que d’ORBD. 3 • Pour la couche transport nous avons utilisé TCP. Concrètement quand un utilisateur souhaite poster, son message est envoyé au serveur. C’est le serveur qui se charge ensuite de rediriger le message sur le bon salon. Si par exemple l’utilisateur n’a pas le droit de poster (amélioration possible) alors son message ne sera pas affiché par le serveur ! Dans le cas contraire, le serveur acquitte le message en renvoyant au client concerné son message. • Pour l’interface graphique nous nous sommes servi de Java et plus particulièrement des JPanel. Nous disposons de cinq principaux JPanel disposé géographiquement grâce à un BorderLayout avec les paramètres North, South, West, Center, East. Ainsi le GridLayout qui regroupe la liste des salons est dans West, le GridLayout qui regroupe la liste des utilisateurs est dans East, le panneau central JTextArea où s’affiche les messages est dans Center, la barre où l’utilisateur entre son message et peut l’envoyer et dans South et l’affichage du salon actif est dans North. Les simples textes comme « pseudo », « salons » sont de simples JLabel. Nos divers salons et pseudos d’utilisateurs (dans leur panel respectif) sont en fait des JButton, comme le bouton « Send », permettant ainsi de pouvoir s’en servir en un simple clic. 2. Nos fichiers Notre programme en Java est composé de 5 fichiers, nous allons détailler ici ces fichiers ainsi que les fonctions qui les composent (les fonctions « triviales » ne sont pas explicitées) : • ChatRoomImpl.java : fichier qui regroupe tout ce qui concerne la gestion du « chatroom » en général, ainsi que le lien avec Corba. Ce fichier contient entre autre les fonctions : - unsubscribe : permettant de déconnecter un utilisateur des salons - miseAJourSalonUsers() : met à jour la liste des utilisateurs ainsi que les salons. - post (String msg, String pseudo, String salon) : fonction qui gère l’affichage des messages appelés « posts » ainsi que les diverses commandes de salon. - getSalon(int i, String pseudo) : renvoie le salon courant. - getUsers(int index, String pseudo) : retourne la liste de tous les utilisateurs du chat. - pleaseCreateMP(String avecqui, String dequi, String nomMp) : permet d’activer la gestion des messages privés. - connectSalon(String salon, String pseudo) : connecte un utilisateur à un salon. 4 • ChatUserImpl.java : fichier qui gère principalement toute l’interface graphique du programme (nous ne développons pas ici ses fonctions) ainsi que quelques autres fonctions : - put(String msg, String salon) : gère l’affichage des diverses commandes. - isMP(String salon) : teste si le salon courant est un salon privé. - setSalon() : permet l’affichage des salons. - setTabUsers() : permet l’affichage des utilisateurs. - askMeToCreateMP(String avecqui, String nomMp) : affichage d’une fenêtre de messagerie privée au destinataire du « mp », par le serveur. - createMP(String avecqui) : permet de créer une conversation privée (salon privé). - deleteMP(int i) : supprime le salon privé. - inscription(String args[]) : fonction complexe qui gère les liens de notre application avec Corba. • GestionSalon.java : fichier qui gère tout ce qui se rapproche aux salons, comme joindre, créer un salon, se déconnecter etc. - belongSameSalon(String salon, String pseudo) : teste si un utilisateur appartient ou non à un salon donné. - connectSalon(String salon, String pseudo) : ajoute un utilisateur aux salons. - changeNick(String lastpseudo, String newpseudo) : pour tous les salons dans lesquels l’utilisateur est connecté, change son pseudo. - createSalon(String salon) : permet la création d’un salon. - deconnect(String salon, String pseudo) : fonction qui déconnecte et supprime un utilisateur d’un salon. • MessagePrivé.java : fichier regroupant ce qui concerne les salons privés/messages privés (mp) ainsi que l’interface graphique de ceux-ci. - put(String msg) : affiche le message a l’écran. - setPseudo(String _pseudo) : gère un changement de nom par exemple. • Salon.java : permet de créer un salon - userBelongOn(String pseudo) : teste si un utilisateur est présent ou non. - changeNick(String lastpseudo, String newpseudo) : pour le salon courant, change le pseudo de l’utilisateur s’il est connecté. 5 • CenteredDialog.java : Fichier qui permet d’afficher la première fenêtre de dialogue du programme nous demandant d’entrer notre pseudo. Ce fichier est appelé, il n’a pas été réellement créé par nos soins. 3. Nos commandes Nous avons créés plusieurs commandes facilitant l’utilisation de notre salon de discussion. Nous allons voir l’utilisation et le fonctionnement de chacune d’elles : • Les commandes sont des mots de quatre lettres précédés d’un « / ». Les commandes s’écrivent en minuscules. • Elles permettent l’utilisation de notre programme en mode console et facilitent son utilisation en mode graphique. • Notre programme contient : - /msgp <dest> <msg> : permet d’envoyer un message privé (plus couramment appelé « mp ») à un autre utilisateur connecté. - /msga <msg> : permet l’envoi d’un message a tous les channels/salons sur lequel l’utilisateur est connecté (hormis les discussions privées évidemment). - /nick <nick> : permet à l’utilisateur de changer de pseudo. Ce changement de pseudo n’intervient pas dans les conversations privées. - /join <channel> : permet à l’utilisateur de rejoindre le salon « channel ». - /quit <channel> : permet à l’utilisateur de quitter le salon « channel ». - /disc : déconnecte l’utilisateur de tous les salons et lui fait quitter l’application. - /msgc <channel> <msg> : permet tout simplement à l’utilisateur d’envoyer un message dans le salon « channel ». - /ltu_ : affiche la liste de tous les utilisateurs connectés dans tous les salons. - /ltc_ : affiche la liste de tous les salons. - /ltuc : affiche la liste des utilisateurs présents dans le salon « channel ». 6 4. Diagramme de classes 7 II. DEFINITION DES PROTOCOLES PROTOCOLES – RF RFC 1. Introduction Le but du protocole de notre salon de discussion est de transférer des messages selon un procédé simple et efficace. Ce protocole pourra gérer les principales fonctions que possède un IRC. Il est possible d’envoyer un message sur un salon, à un utilisateur ou encore de faire un broadcast. La création, la connexion et la déconnexion à un salon, sans oublier de lister tous les utilisateurs et les salons existants sur le serveur sont implémentées. 2. Le modèle Les applications sont basées sur le protocole TCP. Le serveur écoute sur le port 2810 afin de pouvoir utiliser le service de nommage. Une fois la connexion établie, l’application utilise Corba pour l’envoie et la réception des messages. 3. Les procédures Cette section présente les différentes procédures utilisées dans notre protocole. /msgp <sp> <DEST> <sp> <MSG> <CRLF> Cette commande indique qu’un message peut être envoyé à un destinataire sous forme d’un message privé. /msga <sp> <MSG> <CRLF> Cette commande indique qu’un message est envoyé à tous les salons sur lesquels l’utilisateur est connecté 8 /msgc <sp> <CHANNEL> <sp> <MSG> <CRLF> /msgc permet d’envoyer le message « MSG » au salon « SALON » /nick <sp> <NICK> <CRLF> La commande /nick permet à l’utilisateur de changer de nom. Si la commande est envoyée par le client sans erreur, le serveur la lui renvoie. Sinon un format de commande est envoyé au client par le serveur. /join <sp> <CHANNEL> <CRLF> /join permet à l’utilisateur de rejoindre ou de créer un salon « CHANNEL ». Si le client envoie la commande sans erreur, le serveur la lui renvoie. Sinon il renvoie le format nécessaire au bon déroulement de la commande. /quit <sp> <CHANNEL> <CRLF> Cette commande permet de quitter le salon « CHANNEL ». Si la commande est réussie par le serveur alors elle est renvoyée au client. Le client change de salon actif, si celui-ci est le salon a quitté. /disc <CRLF> /disc déconnecte l’utilisateur de tous les salons et quitte l’application. /ltu_ <CRLF> Cette commande affiche la liste des utilisateurs connectés sur le serveur. /ltc_ <CRLF> /ltc_ affiche la liste de tous les salons présents sur le serveur. 9 /ltuc <CRLF> Cette commande permet l’affichage de la liste des utilisateurs du salon courant. /err_ <sp> <CMD> : <MSG> <CRLF> Cette commande est renvoyée par le serveur lorsqu’il rencontre une erreur lors de l’exécution de la commande <CMD> et joint le message <MSG> expliquant l’erreur. Exemple 1/ Exemple de procédure de création de salon. Cet exemple de séquence montre la création d’un salon discussion « Warcraft3 » : S: /join Warcraft3 R: /join Warcraft3 La création du salon Warcraft3 est accepté : en effet la réponse /join Warcraft3 par le serveur veut bien dire que la création a bien été faite. Exemple 2/ Exemple de procédure de discussion privée. Cet exemple de séquence montre une discussion privée demandé par Toby, utilisateur de l'hôte Alpha, à Sonia utilisateur de l'hôte Beta. Nous supposerons que l'hôte Alpha contacte l'hôte Beta directement. S: /msgp Sonia Salut Toby R: /msgp Sonia Salut Toby S: /msgp Toby Salut ma ptite Sonia !!! R: /msgp Toby Salut ma ptite Sonia !!! S: /msgp Sonia Ca va ?! R: /msgp Sonia Ca va ?! 10 S: /msgp Toby :-) R: /msgp Toby :-) La réponse par le serveur /msgp Sonia Salut Toby veut bien dire que le message a bien été envoyé. 4. La spécification SEMANTIQUE DES COMMANDES Nos commandes sont des chaînes de caractères terminées par une séquence <CRLF>. Les codes de commande eux-mêmes sont constitués d'une séquence de digits en mode texte terminée par un <SP> lorsque des paramètres suivent, sinon par <CRLF>. SYNTAXE DE COMMANDES Les commandes consistent en un code de commande suivi d'un champ d'argument. Les codes de commande sont constitués de quatre caractères alphabétiques ou de trois caractères alphabétiques et d’un « _ ». Il est tenu compte de la casse pour le code de commande. Ainsi, seul les écritures en minuscule de toutes les commandes sont acceptées. 5. Glossaire Utilisateur Un être humain (ou un programme sous contrôle d'un être humain) désirant utiliser le service de messagerie. Par extension, un récipiendaire de message sur un hôte. <CRLF> La séquence constituée du caractère Retour Chariot (code 13) et du caractère Nouvelle ligne (code 10). <SP> Le caractère espace (code 32 de l'ASCII). 11 Mot Une séquence de caractères imprimables. Message Une séquence de caractères ASCII de longueur arbitraire, conforme aux spécifications du document "Standard for the Format of ARPA Internet Text Messages" (RFC 822 [2]). Commande Une requête émise par un émetteur pour déclencher l'exécution d'une action par un récepteur. Hôte Une machine située sur un réseau interconnecté hébergeant un salon de discussion. 12 III. EXEMPLES DE SCENARII D’UTILISATION Ici on voit la fenêtre telle qu’elle s’affiche au lancement de notre programme. On remarque la petite fenêtre invitant l’utilisateur à entrer le pseudo et le listing des salons et des pseudos en arrière plan. Le JLabel « nick Name » ne contient pas le pseudo de l’utilisateur étant donné que l’utilisateur n’est pas encore connecté au serveur. Sur cette l’utilisateur image a tapé /join StarWars. On observe donc que son pseudo s’affiche dans le salon StarWars et que le salon StarWars apparaît dans le listing des salons. Un label lui indique également le salon dans lequel il discute. 13 Sur ce screenshot, on observe une discussion entre deux utilisateurs dans le salon « Cinema ». L’utilisateur Toby est connecté à divers salons affichés dans son listing. On observe que Filou a tapé la commande /ltuc, le serveur affiche donc le listing des utilisateurs dans le salon courant. Lorsqu’il n’y a plus d’utilisateurs dans un salon alors ce dernier se détruit automatiquement. 14 L’utilisateur « Fxl » a changé de pseudo et s’appelle maintenant « Ludo ». Après avoir fait un listing des utilisateurs on voit que « Ludo » apparaît à la place de « Fxl ». Sur ces deux images on peut lire la conversation entre deux utilisateurs en message privé. Chaque utilisateur a bien évidemment sa fenêtre ! Cette discussion s’effectue dans le salon « TobyFxl » (le salon se nomme en fait avec les deux pseudos qui discutent mis bout-à-bout). Ce salon est bien évidemment disponible dans la liste des salons des deux utilisateurs (voir screenshot précédent). 15 CONCLUSION Réaliser une application complète en Java (client et serveur) et qui fonctionne a été notre priorité tout au long de notre programmation. Au vue du nombre de fonctions, débuguer le programme n’a pas été chose simple. De plus les diverses commandes pour lancer serveur, client, orbd etc. ne nous ont guère facilité la tâche ! L’interface graphique ne nous a pas excessivement pris de temps (Java est vraiment intuitif) mais faire le lien entre elle et le code n’a quand même pas été chose simple ! L’actualisation de cette interface en fonction des diverses fonctions utilisées en arrière-plan ne fût pas facile. Vous trouverez à cette adresse : http://users.info.unicaen.fr/~pviard/UE10/chIRC/ notre projet. RESPONSABILITE DE CHACUN DES ETUDIANTS La majeure partie de notre travail s’est effectuée en groupe. Cependant chacun d’entre nous a eu une tache à s’occuper plus particulièrement. Thibaut a eu en charge la majeure partie Java/Corba du projet, à savoir la réalisation du client et du serveur. Thomas s’est occupé de la RFC et de l’IDL ainsi que de l’interface graphique avec Ludovic. Ludovic a donc réalisé le rapport ainsi que l’interface graphique (Java) avec Thomas. Philippe a réalisé le client et le serveur en C++ ainsi que la gestion des commandes pour se servir du logiciel (les commandes utilisables telles que /quit /join etc.) La majeure partie de réalisation de notre travail a été la conception du projet en Java. Tout le monde a participé à cette réalisation même si Thibaut en a été le « chef d’orchestre ». La réalisation de notre programme en C++ n’est pas totalement finie. Nous avons rencontré plus de problèmes entre Corba et C++ qu’entre Corba et Java. Nous avons préféré axer notre travail sur 16 la réalisation d’une application Java qui fonctionne. Nous espérons cependant qu’elle sera finie pour le jour de notre soutenance. La réalisation de la RFC fut assez longue et nous a pris pas mal de temps. AMELIORATIONS POSSIBLES Par manque de temps nous n’avons pas réalisé toutes les optimisations que nous aurions souhaité faire. Par exemple, il faut être connecté à un salon pour pouvoir lire les messages de ce salon. Si un utilisateur va dans le salon « ciné » il ne pourra pas lire les messages écrits par des utilisateurs dans le salon « musique » sauf s’il s’est auparavant connecté à ce salon. Avec du temps, on aurait pu, soit gérer un historique des messages de chaque salon et ensuite afficher les messages du salon dans lequel l’utilisateur est connecté (trier les messages en fait), soit gérer un panel pour chaque salon, puis switcher entre les divers panels quand l’utilisateur change de salon, ces deux solutions permettent de mieux suivre une conversation entamée sur un salon. De plus, nous n’avons pas géré le « multi-serveur », à savoir que plusieurs serveurs puissent se connecter entre eux afin de mettre en commun leurs salons et leurs utilisateurs. De même nous n’avons pas d’ « opérateurs », ces utilisateurs qui administrent les salons. Nous ne gérons pas les droits des utilisateurs. N’importe qui peut donc créer un salon, un message privé etc. Un utilisateur gênant ne peut donc pas non plus être « kické » (exclu) ! Evidemment plusieurs autres améliorations sont possibles, cependant elles restent assez « gadgets », comme par exemple la gestion des avatars des utilisateurs, les couleurs dans les messages etc. Des améliorations sur la beauté du programme en quelque sorte. De plus nous manquons légèrement d’affichage de renseignements. Par exemple lorsqu’un utilisateur change de pseudo, il aurait été sympathique qu’un message s’affiche à l’écran (dans le panel des messages). 17