TP N°4 Développement d’ une application Client / Serveur en utilisant les Sockets TCP Dans une archi C/S: Le serveur (vveb, BD, de messagerie, etc) offre un service sur le réseau (accepte des requêtes, les traite et renvoie le résultat au client). Le client utilise le service (envoie une requête et reçoit la réponse). Qui dit TCP dit mode connecté et fiabilité de communication Dans plusieurs applications, la communication qui se produit entre le client et le serveur doit être fiable (faut gérer: les pertes, les doubles, les erreurs, le désordre…) D’où l’utilisation du protocole de transport TCP : Mode connecté Garantie une communication fiable
Notion du Port Permet d’identifier un service sur une machine. Il tient sur 16 bits (valeurs de 0 à 65535). Ports réservés aux services standards : 0-1023 (HTTP : 80, FTP: 21 …)
Notion de socket Socket désigne un point de communication identifié par (Adresse IP , Port) Une connexion s'établit entre une socket source et une socket destinataire. API Socket: Interface pour la programmation réseau au niveau de la couche transport.
C/S mode connecté
Application C/S du TP Le client envoie un message Le serveur le transforme en majuscule et le renvoie au client L’échange se continue jusqu’à ce que le client envoie Fin
Partie I Programme Serveur
Etape 1: Créer le projet monServeur
Etape 2: Créer les sockets côté serveur import java.net.*; public static void main(String[] args) { try { ServerSocket svr = new ServerSocket(5000); System.out.println ("Serveur Connecté sur le port " + svr.getLocalPort() + "en attente d'une requête"); } catch (IOException ex) ….
while (true){ // Boucle Infinie Socket sClient = svr.accept(); System.out.println ("Client connecté sur le port"+sClient.getPort()); // Reste de code à mettre ici }
Etape 3: Créer les flots d’E/S DataInputStream Sin= new DataInputStream(sClient.getInputStream()); DataOutputStream Sout= new DataOutputStream(sClient.getOutputStream());
Etape 4: Boucle Lecture / Ecriture String ch; ch = Sin.readUTF(); // Lecture while ( ! ch.equalsIgnoreCase("Fin") ) { Sout.writeUTF(ch.toUpperCase()); // Ecriture ch= Sin.readUTF(); } sClient.close();
Partie II Programme Client
Et si le serveur réside sur une autre machine ??
Exécuter le serveur ensuite le client
Créer les flots d’E/S
Bouton Envoyer ligne = jTextField1.getText(); Cout.writeUTF(ligne); String ligne; ligne = jTextField1.getText(); Cout.writeUTF(ligne); jTextField1.setText(""); jTextArea1.append("Client:"+ligne+ "\n"); jTextArea1.append("Serveur:" + Cin.readUTF()+ "\n"); if (ligne. equalsIgnoreCase("fin")) { monClient.close(); // System.exit(0); }else{ jTextArea1.append(Cin.readUTF() + "\n"); }
Notre serveur peut prendre en charge plusieurs clients mais à tour de rôle.