Le but du projet Chadow est de réaliser un protocole au dessus de TCP pour un serveur de discussion en ligne (à la IRC ou Discord) qui permet aux utilisateurs connectés de s'échanger des fichiers sans passer par le serveur. Un utilisateur connecté au serveur devra pouvoir télécharger un fichier directement chez un ou plusieurs utilisateurs possédant ce fichier. L'originalité de ce protocole est qu'il devra permettre aux utilisateurs de cacher leur adresse IP des personnes chez qui ils téléchargent les fichiers. Par exemple, si un client A veut télécharger un fichier chez un client B, l'échange pourra se faire en utilisant C comme proxy. C'est à dire que A se connecte à C et que C se connecte à B. Ensuite C relaie les demandes de A vers B et les réponses de B vers A.
Les clients se connectent à un serveur. Chaque client connecté est identifié par un pseudonyme.
Le serveur doit garantir que deux clients ne peuvent pas avoir le même pseudonyme.
Une fois connectés et identifiés par un pseudonyme, les clients peuvent :
Par rapport à un serveur de chat standard (type IRC ou Discord), la particularité du projet est que les clients se connectent à d'autres clients pour télécharger les fichiers. Le serveur va seulement servir à mettre en contact le client voulant télécharger un fichier et les/des clients mettant à disposition ce fichier. Il y a deux modes téléchargement : le mode ouvert et le mode caché.
Dans un téléchargement en mode ouvert, le serveur met en relation directement le client voulant télécharger un fichier avec tous les clients proposant ce fichier. Le client voulant télécharger doit pouvoir télécharger le fichier en parallèle chez plusieurs clients. L'idée étant de pouvoir télécharger plus rapidement un fichier.
Un client doit pouvoir refuser de partager le fichier (même après avoir dit au serveur qu'il proposait ce fichier au téléchargement).
Dans un téléchargement en mode caché, le serveur ne met pas directement en relation le client voulant télécharger un fichier avec tous les clients proposant ce fichier. On veut éviter que les clients qui partagent un fichier connaissent l'adresse IP de la personne qui télécharge et vice-versa. Pour cela, le serveur va utiliser certains clients comme proxys.
Par exemple, supposons que A veuille télécharger un fichier qui est disponible sur F et G.
Le serveur pourra lui dire de passer par D et E et dire à D de transmettre les requêtes de A à F sur ce fichier et de retransmettre les réponses de F à A, toujours pour ce fichier. Pareil pour E qui devra jouer le rôle de proxy pour G.
On veut que le protocole permette de chaîner les proxys mais on ne demande pas que le protocole fixe la façon de choisir les proxys ou les longueurs des chaînes. Ce seront les différentes implémentations qui feront ces choix.
Le travail est à réaliser en binôme (deux personnes : pas plus, pas moins, et du même groupe).
Chaque binome doit rendre une archive contenant la version finale du projet avec: les sources, un jar déjà construit pour le client et pour le serveur, ainsi qu'un script permettant de recréer ces jars, un README donnant les instructions pour construire les jars et pour utiliser les clients.
L'archive doit contenir un rapport qui explique l'état précis du projet :
Pour l'état du projet, vous devez préciser si:
Les trois étapes du rendu seront évaluées à parts égales.
Attention : si rien n'est rendu pour la RFC, la note globale du projet sera 0 et il ne sera pas possible d'accéder aux étapes suivantes. Le projet est obligatoire.
Pour la partie code, chaque groupe doit créer un projet sur gitlab avec votre binôme et ajoutez votre chargé de cours comme "Maintainer" du projet. Les deux membres du projet doivent faire toutes leurs contributions sur le git dans des comits réguliers. Le nom de votre projet sera Chadow-NOM1-NOM2 avec NOM1 et NOM2 sont les noms de famille du binôme dans l'ordre lexicographique.
A l'exception du code fourni par l'équipe enseignante, tout le code présent sur votre dépôt git doit avoir été écrit par vous-même. La présence de code provenant d'une source extérieure rendra impossible l'évaluation de votre projet et sera transmise au comité de discipline de l'IGM.
Si vous voulez utiliser ponctuellement un morceau de code provenant par exemple de StackOverflow, il faut l'attribuer proprement en commentaire de votre code avec l'url de la page source.