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
- Documentation: pages de man et le cours L3 Applications Réseaux. Vous pouvez utiliser les exemples suivants
- code serveur en Java:
EchoServer.java
, - code client en Java:
echoClient.java
, - code serveur en C:
echoserveur.c
, - code client en C:
echoclient.c
, - code serveur en C/IPv6:
echoserveur6.c
, - code client en C/IPv6:
echoclient6.c
, - client python:
echoclient.py
Remarques
- Vous pouvez éventuellement installer des programmes sur la VM avec la commande
sudo apt install <paquet>
.
Client/serveur simples
- Compiler les programmes
EchoServer
etEchoClient
(dans un répertoire local puis copier le bytecode dans le répertoire partagé), ou bien directement sur la VM faire$ java Program.java ...
- 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
- Quelle est la différence entre terminer le client par
Ctrl-C
ouCtrl-D
? - Sur quel port écoute votre serveur? Comment cela est-il configurable?
- Quels sont tous les ports utilisés sur vos machines (utiliser
ss -plat
)? - 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.
- Utiliser
telnet
VM $ telnet <ip-hote> 1234
Y a-t-il une différence avecjava EchoClient
? - Utiliser le client python
echoclient.py
VM $ python echoclient.py <ip-hote> 1234
- En quoi cette partie illustre-t-elle le paradigme client/serveur?
Numéro de ports
- Quel est le numéro de port utilisé par votre serveur ?
- Pouvez-vous le changer en 80 ? Pourquoi ?
- Pouvez-vous le changer en 13 ? Pourquoi ?
- Et si vous lancez le serveur sur la VM ?
- 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:
- créer un processus pour chaque client
- utiliser un thread pour chaque client
- utiliser la méthode
select
- (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.
0.3. Utiliser select
facultatif, mais lire au moins l’exemple.
Voir l’exemple. Adapter au code C précédent.
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 formepseudo> msg
.
Expliquer pourquoi le second applicatif peut difficilement reposer sur
la technique “nouveau processus” (par fork()
).