Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
1
Les sockets
2
Rappel du schéma client-serveur
Appel synchrone requête-réponse Mise en œuvre 1-Haut niveau : intégration dans un langage de programmation : RPC (construit sur sockets) Exemple : RPC en C sous unix 2-Bas niveau : utilisation directe du transport : sockets (construit sur TCP ou UDP) Exemple : utilisation des sockets en Java
3
Introduction aux sockets
socket : (interface) mécanisme de communication permettant d’utiliser l’interface de transport (TCP(fiable)-UDP(service non fiable)). Elle est créée par l’application et contrôlée par le système. Introduit dans Unix dans les années 80 ; standard aujourd’hui Principe de fonctionnement : 3 phases - illustration ci-dessous avec TCP 1) le serveur crée une "socket serveur" pour accueillir les clients (associée à un port) et se met en attente 2) le client se connecte à la socket serveur ; deux sockets sont alors crées : une "socket client", côté client, et une "socket service client" côté serveur. Ces sockets sont connectées entre elles 3) Le client et le serveur communiquent par les sockets. L’interface (analogie) est celle des fichiers (read, write). La socket serveur peut accepter de nouvelles connexions
17
UDP: les donées transmises sont envoyées dans le désordre et peuvent être perdues.
25
Client-serveur avec sockets TCP en Java (très simplifié)
26
Algorithme d’un serveur en mode connecté
27
Algorithme d’un client en mode connecté
28
Algorithme d’un serveur en mode non connecté
29
Algorithme d’un client en mode non connecté
30
Remarques: • L'API (Application Programming Interface) "sockets" est une bibliothèque de Classes de communication entre machines sur TCP/IP contenu dans le paquetage java.net • Le mode connecté correspond au protocole TCP. Le protocole établit une connexion virtuelle et se charge alors de maintenir l'intégrité de la communication et de gérer les erreurs de transmission. • Le mode non connecté correspond au protocole UDP. Ce protocole fait l'envoi au mieux ("best effort"). C'est à l'application de maintenir la qualité de la transmission. UDP est une "couche mince" au-dessus de IP.
31
Les <> classes des sockets en JAVA:
Plusieurs classes interviennent lors de la réalisation d'une communication par sockets. La classe java.net.InetAddress permet de manipuler des adresses IP. La classe java.net.SocketServer permet de programmer l'interface côté serveur en mode connecté. La classe java.net.Socket permet de programmer l'interface côté client et la communication effective par flot via les sockets. Les classes java.net.DatagramSocket et java.net.DatagramPacket permettent de programmer la communication en mode datagramme.
32
Classe Socket: Constructeur :
Socket (String host, int port) : creation du socket sur le port et la machine hôte spécifiés. Méthodes : close() : ferme le socket. OutputStream getOutputStream() : revoie un flux de sortie pour cet socket. IutputStream getIutputStream() : revoie un flux de d’entrée pour cet socket.
33
Classe ServerSocket: Constructeur : ServerSocket (int port) :
creation du socket Serveur sur le port spécifié. Méthodes : Idem que Socket Socket accept() : Ecoute si une connexion est demandée pour cet socket et l’accepte
34
Classe InetAddress Cette classe représente les adresses IP et un ensemble de méthodes pour les manipuler. Conversion de nom vers adresse IP : Les applications doivent utiliser les méthodes : getLocalHost, getByName, ou getAllByName pour construire une nouvelle instance de InetAddress. Conversion de adresse IP vers nom : Méthodes : String getHostName() : Renvoie le nom de la machine hôte de cette adresse.
35
Example I: Le programme du serveur
import java.io.*; import java.net.*; public class Serveur { static final int port = 8080; public static void main(String[] args) throws Exception { ServerSocket s = new ServerSocket(port); Socket soc = s.accept(); // Un BufferedReader permet de lire par ligne. BufferedReader plec = new BufferedReader( new InputStreamReader(soc.getInputStream()) ); // Un PrintWriter possède toutes les opérations print classiques. // En mode auto-flush, le tampon est vidé (flush) à l'appel de println. PrintWriter pred = new PrintWriter( new BufferedWriter( new OutputStreamWriter(soc.getOutputStream())), true); while (true) { String str = plec.readLine(); // lecture du message if (str.equals("END")) break; System.out.println("ECHO = " + str); // trace locale pred.println(str); // renvoi d'un écho } plec.close(); pred.close(); soc.close(); } }
36
Example I: Le programme du client
import java.io.*; import java.net.*; /** Le processus client se connecte au site fourni dans la commande * d'appel en premier argument et utilise le port distant */ public class Client { static final int port = 8080; public static void main(String[] args) throws Exception { Socket socket = new Socket(args[0], port); System.out.println("SOCKET = " + socket); BufferedReader plec = new BufferedReader( new InputStreamReader(socket.getInputStream()) ); PrintWriter pred = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())), true); String str = "bonjour"; for (int i = 0; i < 10; i++) { pred.println(str); // envoi d'un message str = plec.readLine(); // lecture de l'écho } System.out.println("END"); // message de terminaison pred.println("END") ; plec.close(); pred.close(); socket.close(); } }
37
Example II: code client
import java.io.*; import java.net.*; public class Client { static final int port=8081; public static void main(String []argv)throws Exception{ String str="salut serveur",rec1; Socket s1=new Socket(" ",port); //ip exple: en localhost cad sur ta machine c'est l'adresse du serveur BufferedReader in1=new BufferedReader(new InputStreamReader(s1.getInputStream())); //flux d'entré PrintWriter out1=new PrintWriter(new BufferedWriter(new OutputStreamWriter(s1.getOutputStream())),true); //flux de sortie et on vide le tampon avc true out1.println(str); //envoi tn mess au serveur cad "salut serveur" defini en haut rec1=in1.readLine(); //rec1 sert a intercepté les flux de sortie du serveur System.out.println(rec1); //ca t'affiche le message du serveur 1.close(); //on ferme la socket } }
38
Example II:code serveur va lire le message du client et lui envoie salut client
import java.io.*; import java.net.*; public class Serveur { static final int port=8081; public static void main(String []argv) throws Exception {String str; ServerSocket serv = new ServerSocket(port); System.out.println("serveur en attente de connexion sur lengthport:"+port); Socket serr=serv.accept(); System.out.println("connexion acceptée pour le client"); BufferedReader in=new BufferedReader(new InputStreamReader(serr.getInputStream())); PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(serr.getOutputStream())),true); System.out.println("flux ouvert,serveur pret a recevoir"); str=in.readLine(); //affiche au client slt client out.println("salut client"); //on ferme la socketserver et la socket crée serr.close(); serv.close(); } }
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.