Définitions
Client : envoie des requĂȘtes au serveur et attend le rĂ©sultat.
Serveur : attend des requĂȘtes, les traite, renvoie le rĂ©sultat au client.
Architecture client/serveur :
- bas niveau : (matérielle) réseaux téléphoniques
- haut niveau : (logicielle) navigateur / serveur web
Protocole : codification des échanges entre client et serveur en termes de structure, contenu et ordonnancement dans le temps.
Ethernet (bas niveau), http (haut niveau)
Socket : pĂ©riphĂ©rique logiciel permettant lâenvoi et la rĂ©ception de suite dâoctets vers/dâun autre socket.
Domaine : âcontexteâ dâutilisation du socket.
- pour communiquer entre deux processus dâune mĂȘme machine = domaine UNIX;
- pour communiquer entre deux processus distants = domaine Internet.
Protocoles associĂ©s : TCP (mode connectĂ©), UDP (mode non connectĂ©), Raw, âŠ
Implémentations client/serveur basé sur :
- protocole dâenvoi/rĂ©ception de donnĂ©es : TCP, UDP, âŠ
- protocole orientĂ© requĂȘte : RPC, RMI, HTTP
Remarque : La complexité réside dans la définition du protocole et son implémentation dans le langage choisi.
Typologie client/serveur
Mode de communication :
- connectĂ© : le client contacte (= se connecte) le serveur avant dâenvoyer ses requĂȘtes ;
- non connectĂ© : le client envoie directement une requĂȘte au serveur, qui attend de nâimporte qui.
Le mode « non connecté » est notamment utilisé dans le streaming de vidéos
Durée de vie (Keep-Alive) :
- client : une ou plusieurs requĂȘtes, puis terminaison ;
- serveur exécuté en démon : sauf problÚme, tant que la machine fonctionne ;
- serveur exécuté à la demande (pax ex. via inetd) : terminaison quand aucun client.
PossibilitĂ© dâinteraction :
- mono-requĂȘte : un seul type de requĂȘte possible (serveur horaire, echo, âŠ)
- multi-requĂȘtes : plusieurs types de requĂȘtes ;
- serveur mono-client : un seul client Ă la fois ;
- serveur multi-client itératif : plusieurs clients à tour de rÎle ;
- serveur multi-threadé : plusieurs clients en parallÚle.
Remarque :
- cas particuliers dâinteractions serveur/serveur et/ou client/client (par ex. applications pair Ă pair (peer to peer ou P2P)).
Socket
Principe dâutilisation
Client
- Création socket ;
- Liaison Ă une IP + port ;
- demande de connexion Ă lâIP + port du socket serveur ;
- envoi et rĂ©ception de donnĂ©es sous forme de suite dâoctets.
Serveur
- CrĂ©ation dâun socket de connexion ;
- liaison Ă une IP + port ;
- attente de connexion ;
- connexion acceptĂ©e â crĂ©ation automatique dâun socket de communication ;
- envoi et rĂ©ception de donnĂ©es sous forme de suite dâoctets.
127.0.0.1 / localhost
Câest une interface rĂ©seau âboucle localeâ associĂ©e Ă lâIP 157.0.0.1
ou localhost
. Pas besoin de tester les applications avec 2 machines.
En Java
Encapsulation dans des classes simples Ă utiliser (contrairement au C) :
- liaison automatique Ă lâIP + port fournies en paramĂštres ;
- connexion implicite au serveur ;
- âŠ
Mode connecté : classes Socket
et ServerSocket
Mode non connecté : classes DatagramSocket
et DatagramPacket
Remarque : pas de socket UNIX en Java.
Données transmises en utilisant les classes de flux
Mode connecté
import java.net.*;
import java.io.*;
public class TcpServer {
public static void main(String[] args) {
int portServ = Integer.parseInt(args[0]);
ServerSocket waitClient = null;
Socket sockComm = null;
try {
waitClient = new ServerSocket(portServ);
while (true) {
sockComm = waitClient.accept();
// ... communication avec le client
}
} catch(IoException e) {
System.out.println("pb conEtxion client : " + e.toString());
System.exit(1);
}
}
}
Et coté client
import java.net.*;
import java.io.*;
public class TcpClient {
public static void main(String[] args){
String ipServ = args[0];
int portServ = Integer.parseInt(args[1]);
Socket sockComm = null;
try {
sockComm = new Socket(ipServ, portServ);
// ... envoi et réception des données
} catch(IoException e) {
System.out.println("pb connexion client : " + e.toString());
System.exit(1);
}
}
}