Développement d’application client/serveur

Ce matériel couvre les principes fondamentaux du développement d’applications client/serveur en se concentrant sur l’utilisation des API sockets. Il s’adresse aux étudiants en informatique souhaitant comprendre la communication réseau au niveau applicatif, notamment via les sockets TCP et UDP, ainsi que leur programmation en Java.

D'après le document Développement d’application client/serveur

Cet article a été rédigé automatiquement à partir du document source, puis vérifié avant publication.

Document source

Développement d’application client/serveur

Programming, Networking, Sockets · PDF · 25 pages · 2019

Afficher l'aperçu du document

Consulter le document original →

Ce matériel couvre les principes fondamentaux du développement d’applications client/serveur en se concentrant sur l’utilisation des API sockets. Il s’adresse aux étudiants en informatique souhaitant comprendre la communication réseau au niveau applicatif, notamment via les sockets TCP et UDP, ainsi que leur programmation en Java.

Introduction aux sockets

Une socket est un point d'accès aux couches réseau, localement liée à un port. Elle permet d’adresser une application sur le réseau via le couple @IP:port. La socket facilite la communication avec une application distante en se connectant à un port spécifique sur une machine distante.

Types de sockets

  • Stream Sockets (TCP) : communication en mode connecté, fiable, ordonnée, avec notification en cas d’interruption. Utilisé par des services comme ftp, http, smtp, telnet, BGP.
  • Datagram Sockets (UDP) : communication en mode non connecté, envoi de paquets indépendants, plus rapide mais moins fiable que TCP. Utilisé par snmp, RPC, tftp, dhcp, dns, RIP.

La notion de port

Un port est un identifiant numérique (16 bits) qui permet d’accéder à un service rendu par un programme serveur sur une machine. Chaque service est accessible via un numéro de port spécifique.

Communication en mode connecté (TCP)

La communication TCP repose sur un flot bidirectionnel d’octets transférés de manière fiable et ordonnée entre deux entités connectées. Trois phases sont nécessaires :

  • Établissement de la connexion : un initiateur (client) ouvre activement la connexion, un répondant (serveur) l’ouvre passivement.
  • Transfert de données : échanges de requêtes et réponses selon le protocole applicatif.
  • Libération de la connexion : fermeture par les deux parties.

Ouverture passive (côté serveur)

Le serveur crée une socket générique d’écoute dédiée à intercepter les demandes de connexion. Cette socket est caractérisée par au moins un numéro de port et éventuellement une adresse IP. Elle peut stocker les demandes entrantes dans une file d’attente (FIFO) avant acceptation.

En Java, la classe ServerSocket permet cette ouverture passive, avec trois constructeurs possibles :

  • Numéro de port (obligatoire)
  • Numéro de port + taille maximale de la file d’attente
  • Numéro de port + adresse IP

Ouverture active (côté client)

Le client crée localement une socket et l’utilise pour demander l’établissement d’une connexion TCP avec le serveur distant, identifié par son adresse IP et son numéro de port.

En Java, la classe Socket propose quatre constructeurs, dont les plus courants prennent :

  • Adresse IP ou nom d’hôte distant et numéro de port distant (obligatoires)
  • Optionnellement, adresse IP locale et numéro de port local

Acceptation d’ouverture (côté serveur)

Le serveur reste bloqué tant qu’aucune demande de connexion ne lui parvient sur la socket d’écoute. La méthode d’acceptation est bloquante et, lorsqu’une demande est acceptée, crée une socket spécifique dédiée à la connexion avec ce client. Cette socket représente l’extrémité serveur de la connexion TCP.

En Java, la méthode accept de la classe ServerSocket réalise cette opération.

Transfert de données

Le transfert consiste à écrire (émission) ou lire (réception) des messages sur la connexion établie.

En Java, la classe Socket fournit :

  • La méthode getOutputStream pour l’émission
  • La méthode getInputStream pour la réception

Libération de la connexion

La fermeture totale d’une connexion rend impossible l’émission et la réception. Une fermeture partielle peut être possible, bloquant uniquement l’émission ou la réception.

En Java, la classe Socket propose :

  • La méthode close pour fermer la connexion
  • Les méthodes shutdownInput et shutdownOutput pour fermer partiellement la connexion

Communication en mode non connecté (UDP)

Le mode non connecté repose sur l’envoi et la réception de datagrammes individuels, sans garantie de fiabilité ni de connexion préalable. Le protocole UDP est utilisé.

Une seule phase est nécessaire : le transfert de données. L’expéditeur et le récepteur ne sont pas liés par une connexion, et le récepteur détermine l’origine de chaque datagramme reçu.

Après usage, le port est libéré.

Création et caractérisation d’une socket UDP

La socket est créée localement et peut être caractérisée par un numéro de port si elle doit recevoir des données.

En Java, la classe DatagramSocket propose trois constructeurs :

  • Sans paramètre : port anonyme local
  • Avec numéro de port local
  • Avec adresse IP locale et numéro de port

Transfert de données en UDP

L’émission consiste à envoyer un message (X octets) vers une socket distante identifiée. La réception consiste à lire un message et récupérer les caractéristiques de la socket émettrice.

En Java :

  • La classe DatagramSocket fournit les méthodes send (émission) et receive (réception).
  • Les méthodes connect et disconnect gèrent l’association à une socket distante.
  • La classe DatagramPacket permet de construire les paquets pour l’envoi et la réception.

Exemple simple d’utilisation d’une socket TCP en Java

Supposons qu’un client souhaite se connecter à un serveur sur le port 1234 à l’adresse IP 192.168.1.10 :

// Côté client : ouverture active
Socket clientSocket = new Socket("192.168.1.10", 1234);

// Émission de données
OutputStream out = clientSocket.getOutputStream();
out.write("Bonjour serveur".getBytes());

// Réception de données
InputStream in = clientSocket.getInputStream();
byte[] buffer = new byte[1024];
int bytesRead = in.read(buffer);
String response = new String(buffer, 0, bytesRead);

// Fermeture de la connexion
clientSocket.close();

Glossaire des termes clés

  • Socket : point d’accès aux couches réseau, lié à un port, permettant la communication entre applications.
  • Port : identifiant numérique (16 bits) d’un service sur une machine.
  • Stream Socket (TCP) : socket en mode connecté, fiable et ordonné.
  • Datagram Socket (UDP) : socket en mode non connecté, envoi de paquets indépendants.
  • Ouverture passive : création d’une socket d’écoute côté serveur pour accepter les connexions entrantes.
  • Ouverture active : création d’une socket côté client pour initier une connexion.
  • Acceptation : validation d’une demande de connexion par le serveur et création d’une socket dédiée.
  • Émission : envoi de données sur une connexion.
  • Réception : lecture de données reçues sur une connexion.
  • Libération de connexion : fermeture totale ou partielle d’une connexion.
  • Datagramme : paquet de données envoyé en mode non connecté.

Points clés à retenir

  • Les sockets permettent la communication réseau entre applications via l’adressage @IP:port.
  • Le protocole TCP utilise des sockets en mode connecté, garantissant fiabilité et ordre des données.
  • Le protocole UDP utilise des sockets en mode non connecté, plus rapide mais sans garantie de livraison.
  • En Java, les classes ServerSocket, Socket, DatagramSocket et DatagramPacket facilitent la programmation réseau.
  • La gestion des connexions TCP implique ouverture passive (serveur), ouverture active (client), acceptation, transfert de données et libération.
  • Les sockets UDP permettent un échange simple de datagrammes sans connexion préalable.

Partager

Commentaires

Aucun commentaire pour le moment. Posez la première question.

Les commentaires sont relus avant publication. Votre e-mail n'est jamais affiché.

← Toutes les révisions