Données et communications en Java Programmation des applications réparties Olivier Flauzac Master EEAMI-Informatique première année Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 1 / 28 Plan 1 Les scanners 2 Echange de données sur le réseau 3 Threads Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 2 / 28 Les Scanners Objectifs simplifier la lecture depuis les flux lecture d’éléments depuis le clavier lecture d’éléments depuis un fichier ... classe java.util.Scanner utilisation possible des expressions régulières pour définir des séparateurs Exemple Scanner sc = new Scanner ( System . i n ) ; i n t i = sc . n e x t I n t ( ) ; Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 3 / 28 Construction d’objets Scanner Constructeurs depuis un flux d’entrée Scanner ( InputStream s r c ) depuis un fichier Scanner ( F i l e s r c ) depuis une source implémentant Readable Scanner ( Readable s r c ) Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 4 / 28 Accès aux données Lecture lecture en fonction du type schéma global XXX nextXXX ( ) lecture d’un entier lecture d’une chaîne int nextInt () String nextLine ( ) lecture d’un double lecture sous la forme d’une chaîne double nextDouble ( ) S t r i n g next ( ) Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 5 / 28 Méthodes de test Test de la prochaine donnée test de l’existence d’une donnée boolean hasNext ( ) test du type de la prochaine donnée (schéma global) boolean hasNextXXX ( ) un entier boolean h a s N e x t I n t ( ) lecture d’une chaîne un double boolean h a s N e x t S t r i n g ( ) boolean hasNextDouble ( ) Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 6 / 28 Plan 1 Les scanners 2 Echange de données sur le réseau 3 Threads Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 7 / 28 Communication en Java Communications réseau communication par sockets classes de l’API ServerSocket Socket utilisation de descripteurs de flots ObjectOutputStream ObjectInputStream utilisation de la sérialisation Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 8 / 28 La classe InetAddress java.net.InetAddress représentation des adresses IP aucun constructeur public création p u b l i c s t a t i c I n e t A d d r e s s I n e t A d d r e s s . getByName ( S t r i n g nomHote ) throws UnknownHostException p u b l i c s t a t i c I n e t A d d r e s s I n e t A d d r e s s . g e t L o c a l H o s t ( S t r i n g nomHote ) throws UnknownHostException Méthodes p u b l i c S t r i n g getHostName ( ) p u b l i c b y t e [ ] getAddress ( ) p u b l i c S t r i n g getHostAddress ( ) Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 9 / 28 La classe InetAddress (Exemple) Code import java . net . ∗ ; class TestInet { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) { try { I n e t A d d r e s s i = I n e t A d d r e s s . getByName ( "www. univ−reims . f r " ) ; System . o u t . p r i n t l n ( i ) ; System . o u t . p r i n t l n ( i . getHostName ( ) ) ; System . o u t . p r i n t ( " adresse : " ) ; b y t e [ ] b = i . getAddress ( ) ; f o r ( i n t k =0; k<b . l e n g t h ; k + + ) { System . o u t . p r i n t ( b [ k ] + " " ) ; / / r é s u l t a t é t r a n g e } System . o u t . p r i n t l n ( ) ; System . o u t . p r i n t l n ( i . getHostAddress ( ) ) ; } c a t c h ( E x c e p t i o n e ) { System . o u t . p r i n t l n ( " E r r e u r " ) ; } } } Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 10 / 28 Socket côté client La classe Socket création et gestion de socket côté client création des flux associés Méthodes constructeurs Socket ( S t r i n g host , i n t p o r t ) throws IOException Socket ( I n e t A d r e s s a , i n t p o r t ) throws IOException fermeture : v o i d c l o s e ( ) throws IOException flux associés : OutputStream getOutputStream ( ) throws IOException i n p u t S t r e a m g e t I n p u t S t r e a m ( ) throws IOException Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 11 / 28 Socket côté client (suite Récupération d’informations locales I n e t A d d r e s s getLocalAddress ( ) i n t getLocalPort ( ) Récupération d’informations distantes InetAddress getInetAddress ( ) i n t getPort ( ) Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 12 / 28 Socket côté client Code import java . io . ∗ ; import java . net . ∗ ; class TestUrl2 { p u b l i c s t a t i c v o i d main ( S t r i n g arg [ ] ) { String l = null ; Socket soc = n u l l ; BufferedReader l e c t = n u l l ; P r i n t W r i t e r ecr = n u l l ; try { soc = new Socket ( " l o c a l h o s t " , 8 0 ) ; } c a t c h ( UnknownHostException e ) { System . o u t . p r i n t l n ( " hôte inconnu ! ! ! \ n " ) ; } c a t c h ( IOException e ) { System . o u t . p r i n t l n ( " e r r e u r à l ’ o u v e r t u r e de l a s o c k e t ! ! ! } // . . . . . . . . . . . . . . . Olivier Flauzac (URCA) Données et communications en Java \n"); EEAMI-INFO 13 / 28 Socket côté client (suite) Code try { l e c t = new BufferedReader ( new InputStreamReader ( soc . g e t I n p u t S t r e a m ( ) ) ) ; e c r = new P r i n t W r i t e r ( new O u t p u t S t r e a m W r i t e r ( soc . getOutputStream ( ) ) ) ; } c a t c h ( IOException e ) { System . o u t . p r i n t l n ( " e r r e u r à l ’ o u v e r t u r e de l a s o c k e t ! ! ! \ n " ) ; } e c r . p r i n t ( " GET / i n d e x . h t m l HTTP / 1 . 0 \ n \ n " ) ; ecr . f l u s h ( ) ; try { f o r ( l = n u l l ; ( l = l e c t . r e a d L i n e ( ) ) ! = n u l l ; ) { System . o u t . p r i n t l n ( l ) ; } l e c t . c l o s e ( ) ; e c r . c l o s e ( ) ; soc . c l o s e ( ) ; } c a t c h ( IOException e ) { System . o u t . p r i n t l n ( " e r r e u r à l ’ o u v e r t u r e de l a s o c k e t ! ! ! \ n " ) ; } } } Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 14 / 28 Socket côté serveur ServerSocket création et gestion de socket côté serveur création des flux associés Méthodes constructeur ServerSocket ( i n t p o r t ) throws IOException fermeture v o i d c l o s e ( ) throws IOException attente bloquante de connexion Socket accept ( ) throws IOException Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 15 / 28 Exemple de Serveur Code import java . io . ∗ ; import java . net . ∗ ; c l a s s Server { p u b l i c s t a t i c v o i d main ( S t r i n g args [ ] ) { S t r i n g t e x t e O u t = new S t r i n g ( " h e l l o " ) , t e x t e I n = n u l l ; ServerSocket ecoute = n u l l ; Socket s = n u l l ; ObjectOutputStream o u t = n u l l ; O b j e c t I n p u t S t r e a m i n = n u l l ; try { ecoute = new ServerSocket ( 1 2 0 0 0 ) ; s = ecoute . accept ( ) ; o u t = new ObjectOutputStream ( s . getOutputStream ( ) ) ; i n = new O b j e c t I n p u t S t r e a m ( s . g e t I n p u t S t r e a m ( ) ) ; t e x t e I n = ( S t r i n g ) i n . r e a d O b j e c t ( ) ; System . o u t . p r i n t l n ( t e x t e I n ) ; out . w r i t e O b j e c t ( texteOut ) ; s . close ( ) ; } catch ( Exception e ) { System . o u t . p r i n t l n ( " E r r e u r ! ! ! " ) ; } } } Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 16 / 28 Exemple de Client Code import java . io . ∗ ; import java . net . ∗ ; class Client { p u b l i c s t a t i c v o i d main ( S t r i n g args [ ] ) { S t r i n g t e x t e O u t = new S t r i n g ( " b o n j o u r " ) , t e x t e I n = n u l l ; ObjectOutputStream o u t = n u l l ; O b j e c t I n p u t S t r e a m i n = n u l l ; Socket s = n u l l ; try { s = new Socket ( " l o c a l h o s t " , 1 2 0 0 0 ) ; o u t = new ObjectOutputStream ( s . getOutputStream ( ) ) ; i n = new O b j e c t I n p u t S t r e a m ( s . g e t I n p u t S t r e a m ( ) ) ; out . w r i t e O b j e c t ( texteOut ) ; t e x t e I n = ( S t r i n g ) i n . r e a d O b j e c t ( ) ; System . o u t . p r i n t l n ( t e x t e I n ) ; s . close ( ) ; } catch ( Exception e ) { System . o u t . p r i n t l n ( " E r r e u r ! ! ! " ) ; } } } Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 17 / 28 Plan 1 Les scanners 2 Echange de données sur le réseau 3 Threads Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 18 / 28 Threads Généralités flot de contrôle à l’intérieur d’un programme instance de la classe java.lang.Thread rôle de l’objet Thread gestion de l’exécution gestion du contrôle gestion de la synchronisation Implémentations deux approches pour la création : implémentation de l’interface Runnable dérivation de la classe Thread qui implémente déjà l’interface Runnable surcharge de la méthode run() Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 19 / 28 La classe Thread Méthodes constructeur Thread ( ) démarrage v o i d s t a r t ( ) throws I l l e g a l T h r e a d S t a t e E x c e p t i o n création d’un démon v o i d setDeamon ( boolean on ) throws I l l e g a l T h r e a d S t a t e E x c e p t i o n throws S e c u r i t y E x c e p t i o n attente v o i d s l e e p ( l o n g msec ) throws I n t e r r u p t e d E x c e p t i o n Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 20 / 28 Exemple de Thread Code du Thread c l a s s ThreadExemple extends Thread { i n t num ; ThreadExemple ( ) { num = 0 ; } ThreadExemple ( i n t i ) { num = i ; } p u b l i c v o i d run ( ) { f o r ( i n t k =0; k <10; k + + ) { System . o u t . p r i n t l n ( " Bonjour depuis " + num ) ; l o n g temps = ( l o n g ) Math . random ( ) ∗ 100; t r y { t h i s . s l e e p ( temps ) ; } c a t c h ( E x c e p t i o n e ) { } } } } Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 21 / 28 Exemple de Thread Code du lanceur c l a s s Lanceur { p u b l i c s t a t i c v o i d main ( S t r i n g args [ ] ) { Thread t 1 = new ThreadExemple ( 1 ) ; Thread t 2 = new ThreadExemple ( 2 ) ; t1 . s t a r t ( ) ; t2 . s t a r t ( ) ; } } Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 22 / 28 Partage de ressources Partager des éléments possibilité de partager des objets entre des threads pas de méta-éléments ! utilisation dans le thread d’une référence sur l’objet partagé passage de la référence de l’objet lors de la construction attention à la synchronisation mise en place d’exlusion mutuelle Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 23 / 28 Partage de ressources Exemple Code du lanceur p u b l i c c l a s s ThreadLect extends Thread { p r i v a t e i n t [ ] tab ; p r i v a t e i n t num ; p u b l i c ThreadLect ( ) { super ( ) ; num=0; } p u b l i c ThreadLect ( i n t [ ] t , i n t i ) { super ( ) ; t a b = t ; num = i ; } p u b l i c v o i d run ( ) { f o r ( i n t i =0; i < t a b . l e n g t h ; i + + ) { System . o u t . p r i n t l n ( " Thread " + num + " t a b [ " + i + " ] = " + t a b [ i ] ) ; l o n g t p s = ( l o n g ) Math . random ( ) ∗ 100; try { t h i s . sleep ( tps ) ; } catch ( Exception e ) { System . o u t . p r i n t l n ( " E r r e u r " + e ) ; } } } } Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 24 / 28 Partage de ressources Exemple Code du lanceur p u b l i c c l a s s Lanceur { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) { i n t [ ] x = new i n t [ 1 0 ] ; f o r ( i n t i =0; i <x . l e n g t h ; i + + ) { x[ i ] = i ; } Thread t 1 = new ThreadLect ( x , 0 ) ; Thread t 2 = new ThreadLect ( x , 1 ) ; Thread t 3 = new ThreadLect ( x , 2 ) ; t1 . s t a r t ( ) ; t2 . s t a r t ( ) ; t3 . s t a r t ( ) ; / / e n t r e l a c e m e n t des a f f i c h a g e s } } Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 25 / 28 Synchronisation Problème Problème d’accès à des variables partagées variable en lecture et écriture entrelacement ... Solution utilisation d’une directive de synchronisation synchronized ( obj ) { ... } Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 26 / 28 Synchronisation Exemple Code du thread p u b l i c c l a s s ThreadLect extends Thread { p r i v a t e i n t [ ] tab ; p r i v a t e i n t num ; p u b l i c ThreadLect ( ) { super ( ) ; num=0; } p u b l i c ThreadLect ( i n t [ ] t , i n t i ) { super ( ) ; t a b = t ; num = i ; } p u b l i c v o i d run ( ) { s y n c h r o n i z e d ( System . o u t ) { f o r ( i n t i =0; i < t a b . l e n g t h ; i + + ) { System . o u t . p r i n t l n ( " Thread "+ num +" t a b [ " + i + " ] = " + t a b [ i ] ) ; l o n g t p s = ( l o n g ) Math . random ( ) ∗ 100; try { t h i s . sleep ( tps ) ; } catch ( Exception e ) { System . o u t . p r i n t l n ( " E r r e u r " + e ) ; } } } } } Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 27 / 28 Partage de ressources Exemple Code du lanceur p u b l i c c l a s s Lanceur { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) { i n t [ ] x = new i n t [ 1 0 ] ; f o r ( i n t i =0; i <x . l e n g t h ; i + + ) { x[ i ] = i ; } Thread t 1 = new ThreadLect ( x , 0 ) ; Thread t 2 = new ThreadLect ( x , 1 ) ; Thread t 3 = new ThreadLect ( x , 2 ) ; t1 . s t a r t ( ) ; t2 . s t a r t ( ) ; t3 . s t a r t ( ) ; / / pas d ’ e n t r e l a c e m e n t des a f f i c h a g e s } } Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 28 / 28