L’interaction avec le réseau : Les Sockets
En Java, les Sockets permettent la connexion entre 2 programmes (un client et un
serveur). Cette connexion va permettre à ces 2 programmes de communiquer entre
eux à travers un réseau, qu’il s’agisse d’un même ordinateur ou d’ordinateurs
différents.
Chaque socket est identifiée de manière unique par une combinaison de :
· Adresse IP : L'identifiant numérique de la machine hôte sur le réseau.
· Numéro de Port : Un identifiant logique unique au sein d'une machine,
désignant un processus ou un service applicatif spécifique.
Cette combinaison (adresse IP:port) est appelée l'adresse de socket et est
essentielle pour le routage des données vers l'application correcte sur la bonne
machine.
1. Le serveur :
Le serveur est l'entité qui offre un service. Son rôle consiste à :
· Créer une socket d'écoute (ServerSocket en Java) : Cette socket est liée à un
numéro de port spécifique et attend passivement les requêtes de connexion
des clients.
· Accepter les connexions : La méthode accept() de la ServerSocket est
bloquante et attend qu'un client initie une connexion. Lorsqu'une connexion
est établie, le serveur crée une nouvelle socket dédiée pour cette
communication particulière. Cela permet à la ServerSocket principale de
continuer à écouter d'autres requêtes entrantes sans être bloquée par une
seule session client.
· Gérer la communication : Via la socket dédiée, le serveur établit des flux
d'entrée et de sortie pour échanger des données avec le client.
2. Le client :
Le client est l'entité qui demande un service. Son rôle consiste à :
· Créer une socket (Socket en Java) : Cette socket tente activement de se
connecter à une adresse IP et un port spécifiques du serveur.
· Établir la connexion : Si le serveur est disponible et accepte la connexion, une
liaison est établie entre les sockets du client et du serveur.
· Communiquer : Le client utilise les flux d'entrée et de sortie de sa socket
pour envoyer des requêtes et recevoir des réponses du serveur.
Maintenant, Une fois la connexion établie, la transmission des données s'effectue
via des flux d'octets :
· InputStream : Utilisé pour lire les données reçues de l'extrémité distante de la
connexion.
· OutputStream : Utilisé pour écrire les données à envoyer à l'extrémité
distante.
En Java, ces flux de bas niveau sont souvent encapsulés par des classes de plus
haut niveau telles que BufferedReader, PrintWriter pour la manipulation de texte, ou
ObjectInputStream, ObjectOutputStream pour la sérialisation et la désérialisation
d'objets, facilitant ainsi la gestion des protocoles d'application.
Ci-joint, un lien vers drive d’une vidéo où j’explique le code d’un programme qui
utilise les sockets :