Updated Modifié

Le but de cette séance est de voir les bases des applications réseaux et de l’architecture client-serveur.

Il est recommandé de prendre des notes, celle-ci pourront être envoyées à votre chargé de TP (prenom.nom@univ-amu.fr) à la fin de la journée pour avoir un retour.

Préliminaires

Il est recommandé de créer une nouvelle VM pour ce TP :

$ quota -s 
$ mkdir soutienSR/TP3
$ cd soutienSR/TP3
$ vagrant up
$ quota -s

Rappel: vous pouvez travailler dans le répertoire /vagrant de la VM, qui est synchronisé automatiquement avec soutienSR/TP3 sur l’hôte.

Aspects Système et Réseaux

Machine hôte

Combien votre machine hôte possède-t-elle d’interfaces réseaux, quelles sont les adresses IPv4 et IPv6 de celles-ci ? Noter <ip-hote> l’adresse IPv4 pour l’interface principale ens160.

Quel est est votre “bande passante” ?, ie le débit réseaux auquel votre machine a accès.

VM

Combien la VM possède-t-elle d’interfaces réseaux, quelles sont les adresses IPv4 et IPv6 de celles-ci ?

Pouvez-vous contacter la machine hôte ?

$ ping <ip-hote>

NB: si le réseaux semble non fonctionnel sur la VM, faire

$ sudo dhclient eth0

Clients et Serveurs

Documentation et Exemples

Remarques

  • Vous pouvez éventuellement installer des programmes sur la VM avec la commande sudo apt install <paquet>.

Client/serveur simples

  1. Compiler les programmes EchoServer et EchoClient (dans un répertoire local puis copier le bytecode dans le répertoire partagé), ou bien directement sur la VM faire $ java Program.java ...
  2. Exécuter les programmes clients sur la VM et les serveurs sur la VM ou bien l’hôte.

    hôte $ java EchoServer 1234
    

    VM$ java EchoClient <ip-hote> 1234
    

  3. Quelle est la différence entre terminer le client par Ctrl-C ou Ctrl-D?
  4. Sur quel port écoute votre serveur? Comment cela est-il configurable?
  5. Quels sont tous les ports utilisés sur vos machines (utiliser ss -plat)?
  6. Pouvez-vous lancer un serveur en java et un serveur en C en même temps sur la même machine? Pourquoi ?

Autres Clients

Vous pouvez utiliser d’autres clients pour vous connecter au serveur.

  1. Utiliser telnet
    VM $ telnet <ip-hote> 1234
    
    Y a-t-il une différence avec java EchoClient?

  2. Utiliser le client python echoclient.py
    VM $ python echoclient.py <ip-hote> 1234
    

  3. En quoi cette partie illustre-t-elle le paradigme client/serveur?

Numéro de ports

  1. Quel est le numéro de port utilisé par votre serveur ?
  2. Pouvez-vous le changer en 80 ? Pourquoi ?
  3. Pouvez-vous le changer en 13 ? Pourquoi ?
  4. Et si vous lancez le serveur sur la VM ?
  5. Et en demandant gentiment avec sudo ?

En IPv6

Faire toutes les manipulations précédentes sur la VM avec un serveur en IPv6 (comme echoserveur6.c)

Tests Fonctionnels

Une commande permettant de scripter des tests fonctionnels impliquant le réseau est netcat (nc ou nc6). Écrire des tests fonctionnels en bash permettant de tester (avec deux requêtes “un” et “deux”) si chacun des serveurs fonctionnent.

Amélioration(s)

Limitation

Le code exemple fourni de serveur a une importante limitation. L’avez-vous déjà repéré ?

Que se passe-t-il si vous utilisez deux clients en même temps ?

Quel est le problème ?

Gestion Multi-Clients

Il existe plusieurs solutions permettant de résoudre cette problématique:

  1. créer un processus pour chaque client
  2. utiliser un thread pour chaque client
  3. utiliser la méthode select
  4. (utiliser un cadriciel de haut-niveau dédié)

0.1. Créer un nouveau processus

L’appel système permettant de créer un nouveau processus est fork(). Modifier les codes précédents

0.2. Utiliser des threads

Voir le tutoriel. Adapter au code Java précédent.

**Corrigé**

0.3. Utiliser select

facultatif, mais lire au moins l’exemple.

Voir l’exemple. Adapter au code C précédent.

**Corrigé**

Un Serveur Applicatif

Le but de cette partie est, en utilisant comme base les exemples précédents, de créer les applicatifs suivants :

horloge (parlante)
le client reçoit l’heure sur le serveur à chaque requête TIME

salon de discussion (simpliste)
les clients participent à un salon de discussion unique (et donc commun). Le premier message du client est son pseudo, ensuite chaque message msg écrit par un client est retransmis à tous les autres clients sous la forme pseudo> msg.

Expliquer pourquoi le second applicatif peut difficilement reposer sur la technique “nouveau processus” (par fork()).