Données et communications en Java

publicité
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
Téléchargement