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

  1. Création socket ;
  2. Liaison Ă  une IP + port ;
  3. demande de connexion à l’IP + port du socket serveur ;
  4. envoi et rĂ©ception de donnĂ©es sous forme de suite d’octets.

Serveur

  1. CrĂ©ation d’un socket de connexion ;
  2. liaison Ă  une IP + port ;
  3. attente de connexion ;
  4. connexion acceptĂ©e → crĂ©ation automatique d’un socket de communication ;
  5. 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);
		}
	}
}