|
1)Présentation du projet : Le projet est un petit chat qui utilise les connections sockets unicast et multicast. Ce projet à été programmé en java il est composé d'un serveur et d'un client, le client établie une connection unicast avec le serveur puis lui envoie son login, le serveur repond alors sur cette connection au client en lui transmettant l'adresse du groupe multicast sur la quelle se déroule la conversation, le client n'a plus qu'a joindre ce groupe pour y participer. On peut imaginer que le serveur puisse gérer différents salons qu'il communiquerait au client lors de sa connection, celui-ci n'aurait plus qu'à choisir le salon auquel il souhaite participer. Cette option n'est pas implémentée car nous n'en avons pas eu le temps ... 2) Ce qui est nécéssaire pour faire tourner le projet :
Le serveur, lancé sur le port 8000 de mon ordinateur :o) ![]() Et voici les clients :o) ![]() 4) Comment marche le programme ? Tout d'abord parlons un peu du serveur : - Il est composé de socket afin de communiquer directement avec chaque client. A chaque fois qu'un client arrive, un nouveau socket est ouvert afin de communiquer avec lui. De plus le serveur possède un multicast socket qui lui permet de dialoguer avec tous les clients simultanément. - Le but est d'utiliser le multicast socket pour tout les messages que les clients envoient au groupe et le socket unicast uniquement pour la connection et la réception des messages que les clients veulent envoyer. - Lors de la connection le client envoie son login au serveur, si celui-ci n'est pas déjà utilisé dans le salon le serveur accepte la connection, sinon il la refuse. - Après avoir accepté la connection le serveur envoie au client l'ip multicast sur la quelle il va communiquer, on laisse donc en perspective la possibilité que le serveur puisse envoyé une liste d'ip multicast au lieu d'une simple ip, afin que le client puisse choisir lui meme son salon de discution. Quand au client, ce n'est pas lui qui envoie les messages à tout le monde, le client se contente uniquement de les lire. Pour envoyer un message le client le communique d'abord au serveur par le biait de son unicast socket, qui va alors se charger de le transmettre à tout le monde en l'envoyant sur le multicast socket. Le serveur est le seul à écrire sur ce socket multicast. Petit schéma d'illustration: ![]() 5) Comment rendre le programme plus fiable ? Ceci n'a pas pu etre implémenté pour des raisons de temps, mais nous avons cependant imaginé une solution pour s'assuré que tout les clients recoivent bien les messages transmis. Pour la réaliser nous avons besoin d'une table associative, que nous nommerons verif telle que : - la cle : chaine de caratères qui est la concaténation d'une date (nombre de millisecondes écoulées depuis le 01/01/1970 avec le login d'un client, - la valeur : un message. Cette table doit etre statique au serveur. Les modifications qui suivent, et qui concernent le serveur, doivent etre réalisées dans la méthode public void envoieMessage(String msg) de la classe TCPUDPServer.java. Lorsque le serveur veut envoyer un message en multicast à tous les clients, il doit avant de le faire, ajouter à la table verif, pour chaque client, une entrée dont la valeur est le message que le serveur s'apprete à envoyer, et dont la clé est la date actuelle (en millisecondes) à laquelle on concatène le login du client courant (on notatera la cle : cle=date+login pour préciser comment elle est définie). Le message, auquel on a ajouté en entete la date, est alors envoyé (date+message). Lorque un client recoit un message du serveur, il affiche le message auquel il a retiré la date. Puis renvoie au serveur en unicast, la chaine suivante : la concaténation du caratère / avec la date et enfin le login du client (/+date+login). Finalement, le serveur doit analyser le premier caratère lorqu'il s'apprete à envoyer un message : - si c'est le caractère / : c'est que le message est tel que /+date+login. Ainsi le serveur doit retirer de la table verif l'élément dont la clé est date+login, - sinon c'est que le message n'est qu'une chaine de caractère à envoyer telle quelle en multicast à tous les clients, il faut donc ajouter des entrées dans verif comme vu plus haut. Avant d'envoyer, il faut vérifier la validité des messages actuellement stocké dans verif. Pour chaque clé (clé=date+login), si la différence entre la date actuelle et la date de la clé est supérieure à 25 secondes, on considère que le message n'a pas été recut par le client courant. Il faut alors : - supprimer l'entrée courante de verif, - ajouter une nouvelle entrée dans verif, telle que : cle = nouvelle date+login, et valeur = le meme message, - renvoye le message en unicast au client correspondant. |