Socket

Prise (réseau logicielle).

Besoin

Fournir une API de communication entre applications distantes préservant la sémantique des opérations sur des fichiers (open, read, write, close).

Analyse

Une socket représente un point de connexion sur :

Conception

Type de socket Famille de protocole Client Serveur Client et serveur
PF_INET PF_UNIX PF_NS AppleTalk Création Connexion au serveur Association à une adresse Création Configuration de la file d'écoute Attente d'une connexion cliente Lecture Ecriture
Connecté (SOCK_STREAM) TCP O socket connect N/A socket bind listen accept read write
Non connecté (SOCK_DGRAM) UDP O socket N/A bind socket bind N/A N/A recvfrom sendto
Brut IP
Famille d'adresses AF_INET (adresse IP + port) AF_UNIX (nom arborescence Unix) AF_NS

L'utilisation de sockets implique typiquement les opérations suivantes :

  1. Création de la socket (socket) en mode :
    • connecté (TCP typiquement)
      • passif (serveur) : Accepter et attendre les connexions ;
      • actif (client) : Contacter l'application distante et s'y connecter
    • non connecté (UDP typiquement)
  2. Communication établie (bind, listen, connect ou accept)
  3. Echange de données (read/write ou sendto/recvfrom).
    • Pour éviter une lecture bloquant infiniment en attente de données ou de fermeture de socket, on peut fixer un temps d'expiration de la tentative de lecture (l'option Berkeley SO_TIMEOUT, en millisecondes).
    • Pour éviter trop de lourdeur des échanges, les paquets sont bufferisés et envoyés que lorsque les accusés réception des n paquets précédents ont été reçus (système de "fenêtres" ou algorithme de John Nagle : envoi du paquet 11 quand réception de l'accusé du paquet 1 si la fenêtre est de taille 10 par exemple). Ce système peut être contourné pour des applications "temps réel" désirant des accusés réception immédiats pour chaque envoi (via l'option Berkeley TCP_NODELAY), par exemple un client de serveur X Unix recevant les mouvement d'une souris.
  4. Fermeture de la communication (close ou shutdown)
    1. Envoi de TCP Finish (<FIN>)
    2. L'autre partie confirme (<ACK><FIN>). Sans confirmation au bout d'un temps moyen de réponse constaté (ou valeur de l'option Berkekey SO_LINGER), la socket fermante émet un TCP Abort (<RST>) et ferme unilatéralement.
    3. La socket fermante reconfirme (<ACK>)

Implémentation

En Java l'API des socket se trouve dans le package java.net. Une fois les sockets établies, c'est l'API des entrées-sorties (java.io) qui prend le relai pour l'écriture et lecture de données.

Un exemple (simplifié) de client TCP en Java est :

int port = 8000;<br> <strong>java.net.Socket</strong> socket = new <strong>java.net.Socket</strong> (<span class="codeString">"serverhost"</span>, serverPort);<br> <br> java.io.PrintWriter out = new java.io.PrintWriter (socket.getOutputStream(), true);<br> java.io.PrintWriter in = new java.io.BufferedReader (new java.io.InputStreamReader (socket.getInputStream()));<br> out.println (<span class="codeString">"Requête"</span>);<br> String reponse = in.readLine();<br>out.close();<br> in.close();<br> <br> socket.<strong>close</strong>();

Un exemple (simplifié) de serveur TCP en Java est :

int port = 8000;<br> <strong>java.net.ServetSocket</strong> server = new <strong>java.net.ServerSocket </strong>(serverPort);<br> <strong>java.net.Socket</strong> client = server.<strong>accept()</strong>;<br> <br> java.io.PrintWriter out = new java.io.PrintWriter (client.getOutputStream(), true);<br> java.io.PrintWriter in = new java.io.BufferedReader (new java.io.InputStreamReader (client.getInputStream()));<br> String requete = in.readLine();<br> out.println (<span class="codeString">"Réponse"</span>);<br>out.close();<br> in.close();<br> <br> client.<strong>close</strong>();<br> server.<strong>close</strong>();

Exemples

Des exemples d'API de sockets sont :

Notes

Voir