le réseau et java
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 connexionTRANSCRIPT
L'interaction avec le réseau
Korteby Farouk
Cours Java Avancée
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
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
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
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
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
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
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
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){}
Les Sockets JavaLes Sockets Java
Korteby Farouk
Cours Java Avancée
Les Sockets JavaLes Sockets Java
Korteby Farouk
Cours Java Avancée
1. Les sockets en mode connecté1. Les sockets en mode connecté
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)
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
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)
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
Les Sockets JavaLes Sockets Java
Le modèle client-serveur
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é.
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
Les Sockets JavaLes Sockets Java
Korteby Farouk
Cours Java Avancée
2. Un serveur TCP/IP2. Un serveur TCP/IP
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();
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 …
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é
Les Sockets JavaLes Sockets Java
Korteby Farouk
Cours Java Avancée
3. Un client TCP/IP3. Un client TCP/IP
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
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
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){}}
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
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
Les Sockets JavaLes Sockets Java
Korteby Farouk
Cours Java Avancée
4. Les échanges de données4. Les échanges de données
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
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
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
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();
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
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).
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();
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
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
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
Les classes de Les classes de connexionconnexion
Korteby Farouk
Cours Java Avancée
Les classes de connexionLes classes de connexion
- java.net.URL- java.net.URLConnection
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
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
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
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());
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();
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)
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
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
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
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();
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();
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
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()
);}
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
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();
AteliersAteliers
Korteby Farouk
Cours Java Avancée
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
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.
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
AteliersAteliers
Merci de votre AttentionMerci de votre Attention
By Korteby Farouk
Cours Java Avancée