Une application Client-Serveur : Sockets
Principe d’utilisation des sockets TCP en Java
Le serveur sera caractérisé par deux éléments :
1) Une adresse internet (adresse IP), désignant la machine sur laquelle s’exécute l’application serveur
2) Un numéro de port, qui désigne le numéro du service offert par le serveur
Du côté « Client »
On peut assimiler la socket à un appareil téléphonique, la création d’une socket revient à installer un appareil téléphonique, et à composer le numéro du serveur.
try {
socket = new Socket (adresseIP, NO_PORT);
}
catch (IOException e) { /* « !! PROBLEME DE CONNEXION ! ! */ }
Si le serveur (au bout du fil) décroche son combiné, la communication pourra commencer… Exception «IOException» : si le serveur n’est pas libre, ou surchargé, ou autre…
Du côté « Serveur »
Ouvrir une connexion en permanence : créer une socket « d’écoute » de type «ServerSocket »:
try {
socketEcouteur = new ServerSocket (NO_PORT);
}
catch (IOException e) { /* « !! PROBLEME DE CONNEXION ! ! */ }
Mise « à l’écoute » : en envoyant le message «accept()» :
Socket nouvelleSocket = socketEcouteur.accept();
Le serveur « à l’écoute » est un thread à l’état bloqué qui attend que le téléphone sonne.
Si le téléphone sonne et qu’il n’a pas d’autre chose à faire, le serveur décroche pour commencer la communication.
Le serveur agit plutôt comme un central téléphonique : la communication acceptée est déviée sur un nouvel appareil téléphonique le serveur peut se remettre à l’écoute du premier appareil et attendre une nouvelle sonnerie.
Un « ServerSocket » peut admettre jusqu’à 50 demandes de connexions simultanées. Si une connexion est demandée alors que la queue est pleine, cette dernière sera refusée.
Construire l’adresse IP
En Java, une adresse IP est un objet de type «InetAdress» (paquetage java.net):
public static InetAddress getByName(String host) throws UnknownHostException
Retourne l’adresse IP de la machine distante
l’adresse IP peut être spécifiée sous la forme « aaa.bbb.ccc.ddd »
ou alors par un nom composé : « machine.sous-domaine.domaine» ( « java.sun.com »)
en utilisant le système de noms (DNS, Data Name System) qui associe les numéros IP à des noms symboliques par le biais de serveurs de noms répartis sur le réseau.
public static InetAddress getLocalHost() throws UnknownHostException
Retourne l’adresse IP de la machine locale
Utilisation
InetAddress adresseIP;
try {
// Adresse du serveur WinCenter de l’Ecole d’Ingénieurs de Genève : adresseIP = InetAddress.getByName(« 129.194.186.35 »);
// ou : travail en mode local (le serveur = machine locale)
adresseIP = InetAddress.getLocalHost();
// identique à : adresseIP = InetAddress.getByName(« 127.0.0.1 »);
}
catch (UnknownHostException e) { /* adresse inconnue sur le réseau */ }
Fermeture de la connexion
Connexion fermée dès que l’un ou l’autre des deux partenaires ferme la socket:
uneSocket.close() ;
Dès que la connexion est fermée, toute tentative d’accès à la socket se soldera par une levée d’exception de type «IOException».
Ouverture simultanée de plusieurs connexions
On parle alors de « serveur concurrent ».
Sous UNIX, ceci est réalisé en créant des processus enfant (en C) avec la fonction fork().
Chaque connexion est ensuite confiée à un processus enfant qui implémente un thread indépendant.
Transmettre et recevoir des informations au travers d’une socket
Deux flux de données primaires à disposition: « InputStream » & « OutputStream » (paquetage java.io)
Pour y accéder, la classe «Socket» propose les méthodes :
InputStream getInputStream():
OutputStream getOutputStream():
pour retourner le flux d’entrée
pour retourner le flux de sortie
Comme il s’agit de flux de bytes non bufferisés, le programmeur à tout intérêt à travailler de manière plus évoluée en ouvrant des « flux de traitement » (flux de deuxième niveau) pour manipuler ces deux flux primaires.
Par exemple, pour convertir les bytes en caractères :
InputStreamReader isr = new InputStreamReader(socket.getInputStream())
OututStreamReader osr = new OutputStreamReader(socket.getOutputStream())
1. UNIX : ENTREES/SORTIES ET SOCKETS
1.1 Communication fiable
1.2 Communication non fiable de paquets
1.3 Internet et les Sockets
2. JAVA, LE MODELE CLIENT-SERVEUR ET LES SOCKETS
2.1 Principe d’utilisation des sockets TCP en Java
2.2 Principe d’utilisation des sockets UDP en Java
3. ILLUSTRATION : LE PROGRAMME « CHAT » (SOURCES A DISPOSITION !!)
3.1 Interface utilisateur
3.2 Test de l’application
3.3 Protocole Client Serveur
3.4 Le « Client » : diagramme des états et transitions
3.5 Le « Serveur » : diagramme des états et transitions
3.6 Risque d’interblocage
4. ANNEXES
4.1 Classe «Socket» (non exhaustif)
4.2 Classe «ServerSocket» (non exhaustif)
4.3 Classe «InetAddress» (non exhaustif)