= Modèle client-serveur == Objectif de la séance Le but de cette séance est d'expérimenter le modèle client-serveur au dessus de TCP-IP au travers de la programmation d'un jeu. Le TP va se dérouler sur les PC de développement. Nous verrons plus tard deux autres applications du modèle client-serveur avec le serveur HTTP et le protocole MQTT qui permet l'échange d'informations entre des capteurs WIFI et une station de base suivant un modèle client-broker. [https://www.csd.uoc.gr/~hy556/material/tutorials/cs556-3rd-tutorial.pdf cours détaillé sur TCP/IP] ** Schéma de principe d'un échange client-serveur avec le protocole TCP (connecté) [[Image(htdocs:png/client-serveur.png,300px,nolink)]] Pour aujourd'hui, vous allez programmer deux applications. La première met en œuvre N clients TCP et 1 serveur TCP. La seconde application mettra en œuvre N client-serveurs et 1 serveur. == Premiers pas * Nous allons commencer par mettre en place l'infrastructure pour permettre aux personnes présentes de communiquer. Pour cela, faire la liste des personnes présentes dans la salle et les associer au numéro IP. Pour obtenir le numéro IP de sa machine, vous pouvez utiliser `hostname -I` ou `ifconfig`. * Récupérer l'archive [htdocs://docs/tcptme.zip tcptme.zip], la décompresser et compiler l'ensemble avec le Makefile. * Exécuter le serveur_simple sur une première fenêtre de terminal en passant en paramètre le numéro du port sur lequel écoute le serveur. {{{#!c gcc -o server_simple server_simple.c ./server 8000 }}} * Exécuter le client_simple dans un second terminal pour l'envoi d'un message vers le serveur. Ce client permet d'envoyer un message pris sur la liste de commande. Vous pouvez envoyer des messages vers vous-même ou vers d'autres personnes. {{{#!c ./client_simple localhost 8000 "Bonjour" ./client_simple 132.227.107.xx 8000 "Bonjour c'est moi" }}} * Modifier client_simple.c pour ajouter une fonction `envoyer_message()` qui encapsule l'envoi d'un message en tant que client `socket-connect-write-close` * `vote_curses.c` est un programme qui utilise une bibliothèque permettant des réaliser des menus dans un format text. Ce programme permet la sélection entre 4 valeurs : 1, 2, 3 ou 4. Modifier le fichier `vote_curses.c` pour envoyer le vote choisi vers un serveur:port particulier en utilisant votre fonction `envoyer_message()`. * Modifier le fichier `server_vote.c` pour ajouter un traitement sur les votes consistant à compter les votes. * Créer un `serveur_espion.c` qui va recevoir des messages envoyés par `server_vote` lorsque qu'il reçoit un vote pour `4`. Le message contiendra l'adresse ip du votant. == Programmation d'un jeu Le second exemple est un peu plus compliqué. Il s'agit de programmer un jeu dont les règles sont les suivantes : * Le jeu se joue avec au plus 4 joueurs. * Au départ, chaque joueur reçoit une carte tirée au hasard parmi les 100 cartes numérotées de 1 à 100. * Lorsque tous les joueurs sont servis, ils reçoivent un signal de démarrage. * Chaque joueur doit alors compter dans sa tête le nombre de secondes à partir du signal de démarrage et poser sa carte lorsque le nombre de secondes écoulées est égal à la valeur de sa carte. * Si les cartes sont posées dans l'ordre croissant, le tour est gagné. Notez que seul l'ordre est important. * Si le tour est gagné, chaque joueur reçoit une carte de plus au tour suivant et il devra déposer toutes ses cartes dans l'ordre. * Si le tour est perdu, on recommence le jeu avec 1 carte par joueur. Remarques : * Le but est de gagner contre le jeu, il n'y a pas un gagnant parmi les joueurs. * Vous pouvez vous limiter à une carte par tour et compter le nombre de tour gagnant au début. * Vous pouvez vous limiter à 50 cartes pour réduire la durée d'un tour. Pour ce jeu, vous allez devoir écrire 3 programmes : 1. Le maitre du jeu est à la fois un serveur et un client * enregistre les joueurs, * leur distribue les cartes, * donne le signal de démarrage, * reçoit les cartes jouées par les joueurs * et teste si l'ordre est correct pour déterminer si le tour est gagnant 2. Le joueur aspect client qui * s'enregistre auprès du maitre du jeu * pose sa carte en envoyant un message lorsque le temps est écoulé 3. Le joueur aspect serveur qui * reçoit l'acquitement de connexion * reçoit une carte à juer (un nombre) * reçoit le signal de démarrage * reçoit l'information sur la réussite du tour. == Compte-rendu Vous devez remettre les codes commentés de votre jeu et un compte-rendu explicant votre implémentation du jeu et expliquant la séquence des messages sous la forme d'un diagramme UML de séquences.