62
L'interaction avec le réseau Korteby Farouk Cours Java Avancée

Le Réseau et Java

Embed Size (px)

DESCRIPTION

Le package java.net et les API réseau de Java Les Sockets JavaLes sockets en mode connectéUn serveur TCP/IPUn client TCP/IPLes échanges de donnéesLes classes de connexion

Citation preview

Page 1: Le Réseau et Java

L'interaction avec le réseau

Korteby Farouk

Cours Java Avancée

Page 2: Le Réseau et Java

Sommaire

1. Le package java.net et les API réseau de Java

2. Les Sockets Java1. Les sockets en mode connecté2. Un serveur TCP/IP3. Un client TCP/IP4. Les échanges de données

3. Les classes de connexion

Page 3: Le Réseau et Java

Le package java.net et Le package java.net et les API réseau de Javales API réseau de Java

Korteby Farouk

Cours Java Avancée

Page 4: Le Réseau et Java

Le package java.net et les API Le package java.net et les API réseau Javaréseau Java

Ce package fournit un ensemble de classes pour

communiquer sur le réseau Internet (et Intranet),

télécharger des URL et définir de nouveaux protocoles

Il permet notamment de créer et d'accéder à :• des connexions URL (Web)• des connexions Stream socket (TCP)• des connexions Datagram sockets (UDP)• des connexions Multicast sockets

Page 5: Le Réseau et Java

Le package java.net et les API Le package java.net et les API réseau Javaréseau Java

2 packages : java.net et javax.net

Socket TCP :- Socket, ServerSocket- JSSE (Java Secure Socket Layer)Sockets UDP :- DatagramSocket, DatagramPacketSockets MultiCast :- MulticastSocket, DatagramPacket

Page 6: Le Réseau et Java

Le package java.net et les API Le package java.net et les API réseau Javaréseau Java

Adresses IP- InetAddress

Classes réseau niveau application (couche 7)

- URL, URI, URLConnection,- HttpURLConnection,

JarURLConnection

Page 7: Le Réseau et Java

Le package java.net et les API Le package java.net et les API réseau Javaréseau Java

Une bonne partie de ces classes ne sont que très

rarement utilisées par les applications

Les classes les plus utilisées :- URL : un URL Internet (puissante et simple)- Socket et ServerSocket : connexions

TCP/IP- DatagramPacket et DatagramServer :

connexions UDP

Page 8: Le Réseau et Java

Le package java.net et les API Le package java.net et les API réseau Javaréseau Java

La classe java.net.InetAddress:Représente une adresse IP- Utilisée par les classes Socket et DatagramSocket

3 méthodes statiques pour la résolution DNS :public static InetAddress getByName(String

hostname) throws UnknownHostExceptionpublic static InetAddress[] getByName(String

hostname) throws UnknownHostException- Donne l(es) adresse(s) de l'hôte dont le DN est

passé en paramêtrepublic static InetAddress getLocalHost() throws

UnknownHostException- Donne l'adresse de l'hôte local

Page 9: Le Réseau et Java

Le package java.net et les API Le package java.net et les API réseau Javaréseau Java

Exemple : InetAddress server;try {

if(args.length > 0) {server = InetAddress.getByName(args[0]);} else {server = InetAddress.getLocalHost();}System.out.println(server); // le nom du serveur}catch(UnknownHostException e){}

Page 10: Le Réseau et Java

Les Sockets JavaLes Sockets Java

Korteby Farouk

Cours Java Avancée

Page 11: Le Réseau et Java

Les Sockets JavaLes Sockets Java

Korteby Farouk

Cours Java Avancée

1. Les sockets en mode connecté1. Les sockets en mode connecté

Page 12: Le Réseau et Java

Les Sockets JavaLes Sockets Java

Qu'est ce qu'un socket ?

• Point d'entrée entre 2 applications du réseau

• Permet l'échange de données entre elles à l'aide des mécanismes d'entrées / sorties classiques (java.io)

Page 13: Le Réseau et Java

Les Sockets JavaLes Sockets Java

Différents types de sockets :- Stream Sockets (TCP)• Pour établir une communication en mode

connecté• Si connexion interrompue, les applications sont

informées- Datagram Sockets (UDP)• Communication en mode non connecté

(Datagramme)• Données envoyées sous forme de paquets

indépendants de toute connexion. Plus rapide mais moins fiable

- Raw Sockets• Accès aux couches basses (très bas niveau).• Non implémentées en Java

Page 14: Le Réseau et Java

Les Sockets JavaLes Sockets Java

Des exemples d'applicationsApplications TCP les plus connues- FTP, SMTP, TELNET, etc.Applications UDP les plus connues :- Simple Network Management Protocol

(SNMP)- Trivial File Transfert Protocol (TFTP)Les Raw Sockets permettent d'accéder à

ICMP(Internet Control Message Protocol)

Page 15: Le Réseau et Java

Les Sockets JavaLes Sockets Java

Représente une connexion fiable TCP/IP entre 2 processus (qui peuvent être des JVM !)

- La connexion est fiable (contrôle d'erreur, …)- Et 2 flots de données sont établis entre les 2

machines

La connexion est asymétrique :- Une machine est serveur : classe ServerSocket

Elle attend les demandes de connexion et les accepte

- Une machine est cliente : classe SocketElle demande l'établissement de la connexion avec le serveur

Page 16: Le Réseau et Java

Les Sockets JavaLes Sockets Java

Le modèle client-serveur

Page 17: Le Réseau et Java

Les Sockets JavaLes Sockets Java

Principe de fonctionnement1. Le serveur enregistre son service sous un

numéro de port indiquant le nombre de clients qu'il accepte de faire buffériser à un instant t (new ServerSocket(…) )

2. Il se met en attente d'une connexion (méthode accept() de son instance ServerSocket)

3. Le client peut alors établir une connexion en demandant la création d'un Socket (new Socket()) à destination du serveur pour le port sur lequel le service a été enregistré.

Page 18: Le Réseau et Java

Les Sockets JavaLes Sockets Java

4. Le serveur sort de son accept() et récupère un Socket de communication avec le client

5. Ils peuvent alors utiliser des InputStream et OutputStream pour échanger des données

Page 19: Le Réseau et Java

Les Sockets JavaLes Sockets Java

Korteby Farouk

Cours Java Avancée

2. Un serveur TCP/IP2. Un serveur TCP/IP

Page 20: Le Réseau et Java

2. Un serveur TCP/IP2. Un serveur TCP/IP

- Utiliser la classe java.net.ServerSocket- Quand un client se connecte à un port

sur lequel un ServerSocket écoute, ServerSocket crée une nouvelle instance de la classe Socket pour supporter les communications côté serveur

public static final int PORT = …;ServerSocket server = new

ServerSocket(PORT);Socket connection = server.accept();

Page 21: Le Réseau et Java

2. Un serveur TCP/IP2. Un serveur TCP/IP

- Les constructeurs et la plupart des méthodes peuvent générer une IOException

- La méthode accept() est dite bloquante ce qui implique un type de programmation particulier : boucle infinie qui se termine seulement si une erreur grave se produit …

Page 22: Le Réseau et Java

2. Un serveur TCP/IP2. Un serveur TCP/IP

java.net.ServerSocketfinal int PORT = …;try{ServerSocket server = new

ServerSocket(PORT, 5);while(true){Socket socket = server.accept() ;…}}catch(IOException e) {…}//Les sockets en mode connecté

Page 23: Le Réseau et Java

Les Sockets JavaLes Sockets Java

Korteby Farouk

Cours Java Avancée

3. Un client TCP/IP3. Un client TCP/IP

Page 24: Le Réseau et Java

3. Un client TCP/IP3. Un client TCP/IP

- Le client se connecte au serveur en créant une instance de la classe java.net.Socket : connexion synchrone

public static final String HOST = …;public static final int PORT = …;Socket connection = new Socket(HOST, PORT);

- Le socket permet de supporter les communications côté client

- Les constructeurs et la plupart des méthodes peuvent générer une IOException

Page 25: Le Réseau et Java

3. Un client TCP/IP3. Un client TCP/IP

• Le serveur doit être démarré avant le client. Dans le cas contraire, si le client se connecte à un serveur inexistant, une exception sera levée après un time-out.

• La méthode close() ferme (détruit) le socket, côté client comme côté serveur

Page 26: Le Réseau et Java

3. Un client TCP/IP3. Un client TCP/IP

java.net.SocketLes sockets en mode connectéfinal String HOST = "…";final int PORT = …;Socket s = null;try{s = new Socket(HOST, PORT);…}catch(IOException e) {…}finally {try{s.close() ;} catch(IOException e){}}

Page 27: Le Réseau et Java

3. Un client TCP/IP3. Un client TCP/IP

Remarques lors du déroulement de l'exécutionLe serveur :- Après la fermeture de la connexion, il se met en

attente d'une nouvelle connexion du même client ou d'un autre

- Si plusieurs demandes de connexions arrivent simultanément, une seule est acceptée et les autres sont mises en attente jusqu'au accept() suivant (modulo les time-out)

⇒ pour accepter et traiter plusieurs connexionssimultanées, la solution est de multithreader le

serveur

Page 28: Le Réseau et Java

3. Un client TCP/IP3. Un client TCP/IP

Le protocole d'échange des données- Le client et le serveur doivent respecter un protocole

utilisateur d'échange des données VALIDE.

- Exemples de problèmes possibles :-Le client envoie un entier mais le serveur attend un flottant-Le client attend des données du serveur qui lui-même attend des données du client : interblocage (deadlock)

- Attention à l'hétérogénéité des plates-formes client et serveur

Page 29: Le Réseau et Java

Les Sockets JavaLes Sockets Java

Korteby Farouk

Cours Java Avancée

4. Les échanges de données4. Les échanges de données

Page 30: Le Réseau et Java

4. Les échanges de données4. Les échanges de données

2 types d'échanges possibles :

- Échange en mode ligne- Échange en mode BLOC de bytes

Page 31: Le Réseau et Java

4. Les échanges de données4. Les échanges de données

Échange en mode Ligne:- Les requêtes et les réponses sont constituées

d'une ou plusieurs lignes de texte (ASCII 7 bits,UTF-8, UniCode, ASN1, …)Exemples de protocole en mode Ligne : HTTP, FTP,SMTP

- En Java :Utilisation des classes Java d'entrées/sorties java.io.*- java.io.BufferedReader- java.io.BufferedWriter

Page 32: Le Réseau et Java

4. Les échanges de données4. Les échanges de données

Attention :- Les terminateurs de ligne varient selon les

OS :-Tantôt LF '\n', tantôt CR '\r', tantôt CRLF "\r\n", …

- L'encodage n'est pas supporté par tous les langages

- Certains protocoles (HTTP, SMTP, etc) limitent la longueur des lignes

Page 33: Le Réseau et Java

4. Les échanges de données4. Les échanges de données

- Une fois la connexion établie, il faut obtenir les streams d'entrées et de sorties (java.io) auprès de l'instance de la classe Socket en cours

- Flux entrant :InputStream in = socket.getInputStream();InputStreamReader reader = new

InputStreamReader(in);BufferedReader istream = new

BufferedReader(reader);String line = istream.readLine();

Page 34: Le Réseau et Java

4. Les échanges de données4. Les échanges de données

Déroulement :

1. Obtention d'un stream simple : définit les opérations de base

2. Création d'un stream convertissant les bytes reçus en char

3. Création d'un stream de lecture avec tampon : pour lire ligne par ligne dans un stream de caractères

4. Lecture d'une chaîne de caractères

Page 35: Le Réseau et Java

4. Les échanges de données4. Les échanges de données

Flux sortant :OutputStream out = socket.getOutputStream();PrintWriter ostream = new PrintWriter(out);ostream.println(str);ostream.flush();

1. Obtention du flux de données sortantes : bytes2. Création d'un stream pour convertir les bytes

en chaînes de caractères3. Envoi d'une ligne de caractères4. Envoi effectif sur le réseau des bytes

(important).

Page 36: Le Réseau et Java

4. Les échanges de données4. Les échanges de donnéesexemple du client:sSocket s = null;s = new Socket(HOST, PORT);// lecture du flux d'entrée en provenance du serveurInputStream in = s.getInputStream();InputStreamReader reader = new

InputStreamReader(in);BufferedReader istream = new BufferedReader(reader);String line = istream.readLine();

// Echo la ligne lue vers le serveurPrintWriter ostream =new

PrintWriter(s.getOutputStream());ostream.println(line);ostream.flush();

Page 37: Le Réseau et Java

4. Les échanges de données4. Les échanges de données

Échange en mode Bloc de bytes- Les requêtes et les réponses sont des blocs de bytes

d'une taille et d'un format connus de l'autreExemples : RPC, RMI, CORBA, LDAP, …Le bloc peut avoir un entête qui contient un code d'opération et la longueur du corps du bloc qui contient les données

- En Java :Utilisation possible des classes

- java.io.DataInputStream- java.io.DataOutputStream

Mais impose que le client et le serveur soient des JVM

Page 38: Le Réseau et Java

4. Les échanges de données4. Les échanges de données

Les exceptionsLes exceptions- java.net.BindException

Erreur de liaison à une adresse locale (le port est peut être déjà lié)

- java.net.ConnectExceptionRefus de connexion par l'hôte (pas de process qui écoute le port, etc.)

- java.net.NoRouteToHostExceptionLe hôte n'est pas joignable

Page 39: Le Réseau et Java

4. Les échanges de données4. Les échanges de données

- java.net.ProtocolExceptionErreur du protocole (TCP, etc.)

- java.net.SocketExceptionErreur du protocole (TCP, etc.)

- java.net.UnknownHostExceptionErreur de DNS

Page 40: Le Réseau et Java

Les classes de Les classes de connexionconnexion

Korteby Farouk

Cours Java Avancée

Page 41: Le Réseau et Java

Les classes de connexionLes classes de connexion

- java.net.URL- java.net.URLConnection

Page 42: Le Réseau et Java

Les classes de connexionLes classes de connexion

Rappels- URL : Uniform Resource Locator- Une URL est une chaîne de caractères qui permet

de localiser de manière unique une ressource sur le réseau Internet

- Elle identifie à la fois :-Le protocole à utiliser pour charger la ressource (ftp, file,http, etc)-La machine hôte : adresse IP + numéro de port(optionnel)-Le chemin d'accès à la ressource (arborescence)-Le nom de la ressource

Page 43: Le Réseau et Java

Les classes de connexionLes classes de connexion

java.net.URL- Permet le téléchargement des informations

référencées par une URLContient des méthodes pour créer/ouvrir des pages Web

- Constructeurs :URL url1= new

URL("/users/itey/pages/cours/index.html");URL url2= new URL("http://www.inria.fr/");URL url3= new URL(url2, "semir/itey/index.html");URL url4= new URL(url3, "#BOTTOM");URL url5= new URL("http", "www.inria.fr",

"/itey/cv.html");- Peuvent lever une MalformedURLException

Page 44: Le Réseau et Java

Les classes de connexionLes classes de connexion

Méthodes :- String getProtocol(), String getHost()- String getPort(), String getRef()- InputStream openStream()

Obtenir un InputStream d'une connexion au serveur

- URLConnection openConnection()Obtenir un URLConnection

Page 45: Le Réseau et Java

Les classes de connexionLes classes de connexion

- Exemple d'utilisation des méthodes getXxx()URL aURL = new

URL("http://java.sun.com:80/docs/books/" +"tutorial/index.html#DOWNLOADING");

System.out.println("Protocol = " + aURL.getProtocol());

System.out.println("Host = " + aURL.getHost());System.out.println("Filename = " +

aURL.getFile());System.out.println("Port = " + aURL.getPort());System.out.println("Ref = " + aURL.getRef());

Page 46: Le Réseau et Java

Les classes de connexionLes classes de connexion

- Exemple de récupération d'un document :

URL aURL = new URL(args[0]);BufferedReader in = new BufferedReader(new InputStreamReader(aURL.openStream()));String inputLine;

while((inputLine = in.readLine()) != null)System.out.println(inputLine);

in.close();

Page 47: Le Réseau et Java

Les classes de connexionLes classes de connexion

Utilitaires- Chemin relatif :

La classe java.net.URI offre des méthodes pour la construction d'URL "relative"

- Encoder/Decoder :Méthodes statiques de conversion :

x-www-form-urlencoded vers/depuis String

static String URLDecoder.decode(String urlencoded)

Static String URLEncoder.encode(String str)

Page 48: Le Réseau et Java

Les classes de connexionLes classes de connexion

java.net.URLEncoderjava.net.URLEncoder- Convertit une chaîne de caractères String en

un format portable : xxx-www-form-urlencoded-Les caractères ASCII '('a'-'z', 'A'-'Z','0'-'9') restent non modifiés-L'espace est converti en '+'-Tous les autres sont convertis en "%xy" où xy est la représentation hexadécimale des 16 bits de poids faible du caractère

Page 49: Le Réseau et Java

Les classes de connexionLes classes de connexion

java.net.URLConnection- Définit une connexion à une URL

Offre un meilleur contrôle sur le téléchargement d'informations référencées par une URLSuper-classe abstraite indépendante du schéma de connexion

-http, ftp, file, mailto, …- Ses sous-classes :

HttpURLConnectionJarURLConnection

Page 50: Le Réseau et Java

Les classes de connexionLes classes de connexion

Utilisation :1. L'instance est récupérée de openConnection()2. Configuration des paramètres de la connexion

setAllowUserInteraction, setDoInput, setDoOutput setIfModifiedSince, setUsesCaches, …

3. Connexion connect() et obtention d'un InputStream

4. Récupération des champs d'entête (header fields)getContent, getHeaderField, getContentEncodinggetContentType, getDate, getExpiration,getLastModified

Page 51: Le Réseau et Java

Les classes de connexionLes classes de connexion

Exemple de récupération d'un document

URL aURL = new URL(args[0]);URLConnection aURLc = aURL.openConnection();BufferedReader in = new BufferedReader(new

InputStreamReader(aURLc.getInputStream()));

String inputLine;while((inputLine = in.readLine()) != null)

System.out.println(inputLine);in.close();

Page 52: Le Réseau et Java

Les classes de connexionLes classes de connexion

Exemple d'envoi de mail :

public static void main(String[] args) throws Exception {

URL mailto = new URL("mailto:" + args[0]);URLConnection mailtocnx =

mailto.openConnection();mailtocnx.connect();PrintStream p = new

PrintStream(mailtocnx.getOutputStream());p.println("Subject: Test\r\n\r\nSalut!");p.close();

Page 53: Le Réseau et Java

Les classes de connexionLes classes de connexion

java.net.HttpURLConnectionSous interface de URLConnection

-Récupération d'un document via une connexion HTTP

Méthodes :-Positionnement des champs de la requête HTTP

setRequestMethod()-Récupération des champs de la réponse HTTP

getResponseCode(), getResponseMessage()- Clôture de la session HTTP

disconnect() pour les connexions keep-alive

Page 54: Le Réseau et Java

Les classes de connexionLes classes de connexion

Exemple de récupération d'un documentURL hurl = new URL(args[0]);HttpURLConnection hcnx

=(HttpURLConnection)hurl.openConnection();if(hcnx.getResponseCode() ==

HttpURLConnection.HTTP_OK){BufferedReader in = new BufferedReader( new

InputStreamReader(hcnx.getInputStream()));String inputLine;while((inputLine = in.readLine()) != null)

System.out.println(inputLine);in.close();}else{System.err.println(hcnx.getResponseMessage()

);}

Page 55: Le Réseau et Java

Les classes de connexionLes classes de connexion

java.net.JarURLConnection- Sous interface de URLConnection

Récupération d'un fichier JAR ou d'une de ses entrées

- Syntaxe de l'URL :jar:<url>!/{entry} !/ est un séparateur- Un JAR File : jar:http://www.foo.com/bar/baz.jar!/- Un JAR File : jar:file:/local/dev/baz.jar!/- Un rép. : jar:http://www.foo.com/bar/baz.jar!/COM/foo/

-Une entrée :jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class

Page 56: Le Réseau et Java

Les classes de connexionLes classes de connexion

Exemple :

URL url = new URL("jar:http://www.foo.com/bar/baz.jar!/");

JarURLConnection jar = (JarURLConnection)url.openConnection();

Manifest manifest = jar.getManifest();

Page 57: Le Réseau et Java

AteliersAteliers

Korteby Farouk

Cours Java Avancée

Page 58: Le Réseau et Java

AteliersAteliers

• TP1:- Client Serveur Chaîne – application client serveur qui communique une chaîne de caractère.

• 2 classes ServeurChaine et ClientChaine dans 2 fichiers *.java

Page 59: Le Réseau et Java

AteliersAteliers

Serveur: lance une boucle infinie d’attente pour attendre les demandes de connexions des clients. Si la demande est accepte ,la tache rentre dans une boucle chargée de la communication avec un sel client.

Page 60: Le Réseau et Java

AteliersAteliers

Client:La partie cliente effectue une demande de connexion par la creation d’un nouvel objet Socket dans la tache initiale. Les parametres utilises sont l’adresse du serveur et le numero de port

Page 61: Le Réseau et Java

AteliersAteliers

Page 62: Le Réseau et Java

Merci de votre AttentionMerci de votre Attention

By Korteby Farouk

Cours Java Avancée