1.3k likes | 1.54k Views
Programmation Réseaux Illustration : Sockets en Java. Anne-Marie Déry pinna@polytech.unice.fr. À travailler seuls. Concepts généraux. Mise en œuvre Java. Année 2011-2012. Réseau et département SI. Programmation Réseaux Sockets Java Introduction aux applications réparties
E N D
Programmation RéseauxIllustration : Sockets en Java Anne-Marie Déry pinna@polytech.unice.fr À travailler seuls Concepts généraux Mise en œuvre Java Année 2011-2012
Réseau et département SI Programmation Réseaux Sockets Java Introduction aux applications réparties Couches Réseaux : protocoles TCP – UDP Sockets C Programmation par Composants Expériences Industrielles Administration et sécurité des réseaux Réseaux sans fil Applications Temps Réel SI 4 AL IAM et CSSR
Questions préliminaires • Protocoles de transport TCP et UDP ? • Utilisation des adressesInternet ? • Utilisation des ports ? • Programmation sockets : gestion d’entrées/sorties Client : ? Serveur : ? Serveur de noms ? (DNS, LDAP) ?
Besoins d’une application Client-Serveur Similitudes avec un appel téléphonique via un standard 1. Trouver l’adresse du serveur : trouver le no de téléphone de l’entreprise 2. Demander un service spécifique : s’adresser à un service ou une personne précise de l’entreprise (no de poste) 3. Faire la requête 4. Obtenir une réponse Adresse d’un serveur ? Identification d’un service ?
Un peu de vocabulaire Client : entité qui fait l’appel Sockets : moyen de communication entre ordinateurs Adresses IP : adresse d’un ordinateur Serveur : entité qui prend en charge la requête Serveur de noms (DNS) : correspondances entre noms logiques et adresses IP (Annuaire) Port : canal dédié à un service Protocole: langage utilisé par 2 ordinateurs pour communiquer entre eux protocole de transport : comment véhiculer les données – construction de la trame réseau protocole d’application : comment le client et le serveur structurent les données échangées
Adresse Internet et Port Adresse internet attribuée à chaque nœud du réseau série d ’octets dont la valeur dépend du type de réseau associée à un nom logique (Domain Name Server) Chaque hôte possède environ 65535 ports Port canal dédié à un service spécifique 80 pour le service http 25 pour le service SMTP En savoir plus ?
Ports réservés 1 à 1024 services fondamentaux (administrateurs) 1025 à 5000 disponibles pour les utilisateurs TCP Serveur FTP : 21 Serveur Telnet : 23 Serveur SMTP : 25 UDP Agent SNMP : 161 Logger SNMP : 162 Serveur rwhod : 513 Serveur multi processus Applications transactionnelles
Exemples d ’adresses Internet 157.169.9.15 oscar.essi.fr oscar 157.169.20.5 accueil.essi.fr accueil 157.169.20.4 compta.essi.fr compta 157.169.25.201 www-local.essi.fr www-local 157.169.10.222 pcprofs.essi.fr pcprofs 157.169.4.50 ada.essi.fr ada 157.169.10.120 macserver.essi.fr macserver 157.169.10.240 demo.essi.fr demo 157.169.1.20 bibli.essi.fr bibli 157.169.25.110 sfe-srv.essi.fr sfe-srv sfe 157.169.1.153 bde.essi.fr bde 157.169.3.204 niv1a.essi.fr niv1a 157.169.1.155 dessi.essi.fr dessi 157.169.10.2 jessica.essi.fr jessica print2 Résultats d’une recherche dans un DNS
Exemples d ’adresses 157.169.25.200 news-srv.essi.fr news-srv www.essi.fr www-srv.essi.fr news 134.59.132.21 dolphin.unice.fr 157.169.10.1 essi2.essi.fr loghost essi2 Essi : 157.169 I3S: 134.59 serveurs : 25 Administration : 20 ……. En savoir plus ?
Comment trouver les adresses ip ? ipconfig sous Windows ifconfig sous linux Exemple du modem ADSL (Freebox, LiveBox, etc.), deux interfaces réseau : une interface privée, servant à mettre en réseau les ordinateurs connectés à la Freebox. Adresse IP du type 192.168.0.* ou 192.168.1.* . A l’école adresses privées respectant le protocole ipV4 En savoir plus ?
Architecture client serveur Mode de communication qu’un hôte établit avec un autre hôte qui fournit un service quelconque Serveur Client opération send request application send reply « protocole d’application » marshalling
Comment cela fonctionne au niveau du réseau • Identification de la machine qui abrite le serveur par le client • Identification du serveur sur la machine • Canal de communication entre le serveur et le client • Construction de la trame réseau • Echange du protocole d’application au dessus d’un protocole de transport
Une porte à travers laquelle l’application peut à la fois envoyer et recevoir des messages d’une autre application socket Programmation Socket Comment construire des applications client/server qui communiquent via les sockets • Deux types de transports via les socket API: • Datagramme (non reliable) • Orienté flux d’octets (reliable)
Sockets Outil de communication pour échanger des données entre un client et un serveur Canaux de communication (descripteur d’entrée sortie dans lesquels on écrit et sur lesquels on lit) Gestion similaire des entrées sorties standard (écran, clavier) et des fichiers
Un socket : une entrée sortie dédiée au réseau Gestion similaire des entrées sorties standard (écran, clavier) et des fichiers En sortie (ex. System.out) : java.io.PrintStream (ouPrintWriter) utilise unflot dirigé vers une sortie java.io.OutputStream En entrée (ex. System.in) : java.io.InputStream (ou BufferedReader)
Plus précisément un socket Plusieurs types de sockets : pour la communication par flot de données TCP - fortement connectée - synchrone - type client-serveur pour communication réseau par message UDP - en mode datagramme - en mode déconnecté pour communication réseau par diffusion UDP
Exemples d’applications • Un serveur d’Echo • Un exemple : le service SMTP • Demande de citations • Diffusion de citations
Sockets en Java ? Au dessus de TCP ou UDP Une infrastructure puissante et flexible pour la programmation réseau En Java toutes les classes relatives aux sockets sont dans le package java.net
Le Package net • Des Exceptions • Des entrées Sorties • Des Sockets • …... Plusieurs hiérarchies de classes
Des types de Sockets Object ServerSocket DatagramSocket MulticastSocket Socket
Des exceptions Exception IOException SocketException ProtocolException UnknownHostException UnknownServiceException BindException ConnectException
Des Entrées Sorties Object OutputStream FileOutputStream ObjectOutputStream InputStream FileInputStream ObjectInputStream FilterInputStream DataInputStream FilterOutputStream DataOutputStream
Autres Classes Object InetAdress DatagramPacket SocketImpl PlainSocketImpl
Java.net.InetAddress : nommage La classe InetAddress 2 constructeurs : un par défaut qui crée une adresse vide (cf la méthode acceptsur Socket) un qui prend le nom de la machine hôte et l’adresse IP de la machine. Des accesseurs en lecture : pour récupérer l’adresse IP d’une machine (getByName, getAllByName), des informations sur la machine hôte (getLocalHost, getLocalAddress, getLocaName) Des comparateurs : égalité (equals) et type d’adresse (isMulticastAddress) …..
Communication Client Serveur traditionnelleFortement connectéeTCP
TCP fournit un transfert fiable, conservant l’ordre de transfert des octets (“pipe”) entre le client et le serveur Point de vueapplication Flot de requêtes du client vers le serveur Serveur Client opération Ouvrir connexion req1 application req2 req3 reqn Fermer la connexion
create socket, connect to hostid, port=x create socket, port=x, for incoming request: clientSocket = Socket() welcomeSocket = ServerSocket() TCP connection setup wait for incoming connection request connectionSocket= welcomeSocket.accept() send request using clientSocket read request from connectionSocket write reply to connectionSocket read reply from clientSocket close connectionSocket close clientSocket Interaction Client/server :socket TCP Serveur (s’exécutant sur l’hôte) Client
Scénario d’un serveurpour un client Créer le socket de communication avec le client Attente de données sur le flux d’entrée Réception et Analyse des données en entrée Calcul Construction de la réponse Ecriture sur le flux de sortie Fermer le socket de communication
Scénario d’un client Créer le socket de connexion avec le serveur Attendre que la connexion soit établie Récupérer la socket de communication Préparer la requête l’envoyer sur le flux de sortie Attendre des données sur le flux d’ entrée les lire et les traiter Fermer le socket
TCP et Sockets 2 classes : Socket et ServerSocket (java.net package) pour les canaux de communication Classes pour le flot de données XInputStream et XOutputStream
Transfert de données Connexion + « Marshalling »
Accepter les connexions Dans un serveur ? Créer un objet socket pour écouter les demandes de connexion sur le numéro de port associé au service Créer un objet socket pour accepter une connexion d ’un client cet objet servira pour tous les transferts d ’information de ce client vers le serveur
Dans un serveur ?Accepter les connexions ServerSocketmyService; try { myService = new ServerSocket(PortNumber); } catch (IOException e) {System.err.println(e);} Création d’un objet socket pour écouter et accepter les connexions des clients Socket clientSocket = null; try {clientSocket = myService.accept();} catch (IOException e) {System.err.println(e); }
Demander à se Connecter = ouvrir un socket Dans un client identifier lamachine à laquelle on veut se connecter et le numéro de port sur lequel tourne le serveur implique de créer un socket pour cette communication
Se connecter Comment ouvrir un socket ? Dans un client Socket myClient; try { myClient = new Socket("Machine name", PortNumber); } catch (IOException e) { System.out.println(e); } Machine name : machine à laquelle on veut se connecter PortNumber port sur lequel tourne le serveur (> 1023)
Comment envoyer une information ? Côté client : pour envoyer une requête au serveur Côté serveur : pour envoyer une réponse au client 1 Créer un flux de sortie pour le socket pour écrire l’information 2 Constituer le contenu des données à émettre (transformer entiers, doubles, caractères, objets en lignes de texte)
Côté Serveur Pour envoyer des informations au client Exemple d’entrée sortie DataOutputStream : écrire des types de données primitifs; output= new DataOutputStream(clientSocket.getOutputStream());
Côté Client Côté client : pour envoyer une information au serveur Autre exemple d’entrée sortie PrintStream pour afficher des valeurs des types de base (write et println) PrintStream output; try {output = new PrintStream(myClient.getOutputStream();} catch (IOException e) {System.err.println(e);} …..
Comment recevoir de l’information ? Côté serveur : on doit lire la requête du client Côté client : on doit recevoir une réponse du serveur 1 Créer un flux d ’entrée pour le socket et lire l ’information sur le flux 2 Reconstituer les données émises ( entiers, doubles, caractères, objets) à partir des lignes de texte reçues
Côté Serveur pour recevoir les données d’un client DataInputStream input; try { input = new DataInputStream(clientSocket.getInputStream()); } catch (IOException e) {System.out.println(e);}
Côté Client Côté client : pour recevoir une réponse du serveur DataInputStream : lire des lignes de texte, des entiers, des doubles,des caractères... ( read, readChar, readInt, readDouble, and readLine,. ) (writeBytes…) try {input = new DataInputStream(myClient.getInputStream());} catch (IOException e) {System.out.println(e);}
Autres entrées sorties echoSocket = new Socket( "jessica", 7); out = new PrintWriter(echoSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader( echoSocket.getInputStream())); Le BufferedReader prend un Reader en paramètre et non un Stream Utilisation des ObjectInputStream et ObjectOutputStream L’output doit être initialisé en premier sinon blocage à la Création du flux de sortie.
Entrées sorties : comment procéder ? Quid du marshalling ? l’information qui est lue doit être du même type et du même format que celle qui est écrite ATTENTION au choix de vos entrées sorties – respecter la Cohérence des données transmises Le client doit il connaître la nature des E/S du serveur pour être écrit ?
Comment se déconnecter ? Fermer correctement les flux d’entrée sortie et les sockets en cause. Côté client Côté serveur
Comment fermer un socket ? Fermer les output et input stream avant le socket. Côté client output.close(); input.close(); myClient.close(); Côté serveur output.close(); input.close(); clientSocket.close(); myService.close();
Sockets (Communication Client serveur) Le serveur est à l’écoute des requêtes sur un port particulier Un client doit connaître l’hôte et le port sur lequel le serveur écoute. Le client peut tenter une connexion au serveur Le serveur connecte le client sur un nouveau no de port et reste en attente sur le port original Client et serveur communiquent en écrivant et lisant sur un socket
Serveur Echo Un serveur similaire à echo ( port 7). Reçoit un texte du client et le renvoie identique Le serveur gère un seul client.
Déclarations import java.io.*; import java.net.*; public class echo3 { public static void main(String args[]) { ServerSocket echoServer = null; String line; DataInputStream is; PrintStream os; Socket clientSocket = null; try { echoServer = new ServerSocket(9999);} catch (IOException e) {System.out.println(e); }
try { clientSocket = echoServer.accept(); is = new DataInputStream(clientSocket.getInputStream()); os = new PrintStream(clientSocket.getOutputStream()); while (true) { line = is.readLine(); os.println(line); } } catch (IOException e) { System.out.println(e);} } }
Comment écrire un client ? Toujours 4 étapes Ouvrir un socket. Ouvrir un input et un output stream sur le socket. Lire et écrire sur le socket en fonction du protocole du serveur. Effacer Fermer Seule l’étape 3 change selon le serveur visé