Documente Academic
Documente Profesional
Documente Cultură
!"#$% $&'(&)(*+&'$(,-(./+)-0(1-/)2&'/-'3
Introduction Les tches en Java Moniteurs dobjets Envoi dvnements entre tches Java tude de deux patterns Introduction et rappels sur les sockets Sockets en mode flux Sockets en mode datagram Sockets en mode multicast
Master SAR - M1 SRCS - Java 2
4. Programmation rseau
! Fournir un langage de programmation orient objet ! Fournir un ensemble de bibliothques systmes dfinies par des spcifications (J2ME, J2SE, J2EE)
Principe :
Programme source Java public class Bip { public void m() {} } compilation Interprtation ou assemblage du bytecode
ByteCode Java indpendant De los et de la machine 0xCAFEBABE Machine Virtuelle Java Systme dexploitation Machine (CPU)
09/02/2009
09/02/2009
Nombreux outils
! ! ! ! Dveloppement : Eclipse, JBuilder, NetBeans, emacs/jde VM : Sun, Kaffe, Jikes RVM, SableVM, IBM, Compilo : Sun, jikes, gcj, Manipulation du bytecode : ASM, BCEL, Javassist,
09/02/2009
09/02/2009
Remarque :
Propritaire: "Bob" Solde: 187.27 Propritaire: "Bill" Solde: 897.09
7
! Une mthode dinstance peut manipuler des champs de classe et dinstance ! Une mthode de classe ne peut manipuler que des champs de classe
09/02/2009 Master SAR - M1 SRCS - Java 8
public Compte(String proprietaire) { // Constructeur, appel lors de la cration this.proprietaire = proprietaire; this.solde = 0; // this rfrence notre instance } public void crediter(double montant) { solde += montant; } public boolean debiter(double montant) { // public : visible en dehors de la classe if(solde >= montant) { solde -= montant; return true; } else return false; }}
9 09/02/2009 Master SAR - M1 SRCS - Java 10
09/02/2009
! Mot cl : extends
Pas dhritage multiple en Java ! Ne possde que des mthodes ! Dcouple la dfinition dune classe de son implantation
" Une interface peut tre implante (mot cl implements) par plusieurs classe " Une classe peut possder plusieurs interfaces
09/02/2009
09/02/2009
14
1.c. Pense-bte
CLASSPATH : liste des rpertoires dans lesquels la VM va chercher des .class? Comment compiler un fichier Toto.java?
javac Toto.java ! cration de Toto.class java Toto
Quest ce quune exception? mcanisme de retour anticip dune mthode pour signaler un comportement anormal Comment traiter une exception? try { m(); } catch(MyException e) { System.out.println("Ce nest pas normal"); e.printStackTrace(); }
09/02/2009
15
09/02/2009
16
1.c. Pense-bte
Comment lever une exception? throw new MyException("Yeah!"); Comment passer un paramtre une application Java java monpackage.Maclass arg0 arg1 arg2 Comment positionner une proprit java Dfile.separator=\ Comment consulter une proprit String prop = System.getProperty("file.separator", "valeur par dfaut");
2. Entres/Sorties en Java
09/02/2009
17
09/02/2009
18
2. Entres/sorties en Java
But : lire/crire des donnes partir dun fichier, de la mmoire, du rseau Deux API dentres/sorties
! Entres/sorties bloquantes (java.io.*) tudies dans ce cours ! Entres/sorties non bloquantes (java.nio.*) non abordes
2. Entres/sorties en Java
InputStream : lecture de donnes int read(); Lit un octet du flux Bloquant Return -1 si fin du flux
InputStream is = int i = is.read(); while(i != -1) { traitement i = is.read(); } is.close();
09/02/2009
22 | 27 | 13
Flux
20
2. Entres/sorties en Java
FileInputStream : lecture de donnes partir dun fichier (hrite de InputStream) Bloquant, int read(); binaire, Lit un octet du fichier par flux
InputStream is = new FileInputStream( "/tmp/toto"); int i = is.read(); while(i != -1) { traitement i = is.read(); 22 | 27 | 13 } is.close(); Flux
2. Entres/sorties en Java
# Srialisation : reprsentation sous forme binaire dun objet Java # Utilis pour changer des objets (envoi dobjets, persistance) # Ne marche quavec des Objets implantant linterface serializable
FileOutputStream : criture de donnes dans un fichier (hrite de OutputStream) void write(int b) crit un octet dans le fichier
OutputStream os = new FileOutputStream( "/tmp/toto"); os.write(22); os.write(27); os.write(13); os.close();
09/02/2009
21
09/02/2009
22
ObjectInputStream : lecture dobjets seralisables Object readObject(); Lit un objet dun flux Repose sur un InputStream
InputStream is = new ObjectInputStream(new FileInputStream( "/tmp/toto"));
3. Programmation concurrente
a. b. c. d. e. Introduction Les tches en Java Moniteurs dobjets Envoi dvnements entre tches Java tude de deux patterns
Object o = is.readObject();
09/02/2009
23
09/02/2009
24
3.a. Introduction
Processus = ensemble d'instructions + tat dexcution
(pile, registres, pc, tas, descripteurs dE/S, gestionnaires de signaux) ! ! ! !
3.a. Introduction
Intrts des threads : communication inter-processus via la mmoire
Programmation vnementielle (IHM) Entres/sorties non bloquantes Gestion de temporisateurs Servir plusieurs clients en parallle
! Processus lger (ou thread) : partage son tas, ses descripteurs et ses gestionnaires
09/02/2009
class MonThread implements Runnable { public void run() { System.out.println("Im a thread!"); 45'-#,(67#/)6 }
t.run();
45'-#,(689(45'-#,"
public static void main(String args[]) { // Un thread possde optionnellement un nom symbolique Thread t = new Thread(new MonThread(), "My Thread"); // MonThread.run() est dmarr dans un nouveau thread aprs lappel de start() t.start(); System.out.println("Ce code sexcute en // de run()"); } }
09/02/2009 Master SAR - M1 SRCS - Java 28
45'-#,(67#/)6
45'-#,(645'-#,:;"
! Un thread meurt lorsque sa mthode run() se termine ! Pas de passage de paramtre directement un Thread
Passage dargument via linstance du Runnable class MonThread extends Thread { private int value; MonThread(int value) { this.value = value; } public void run() { System.out.println("value is:" + value); } public static void main(String args[]) { (new MonThread(22)).start(); } } $ Il est parfaitement absurde dappeler run() directement (ne cre pas le
public static void main(String args[]) { // MonThread sera un Thread nomm automatiquement "Thread-1" Thread t = new MonThread(); // MonThread.run() est dmarr dans un nouveau thread aprs lappel de start() t.start(); } }
09/02/2009 Master SAR - M1 SRCS - Java 29
processus lger)
09/02/2009
30
public static void main(String args[]) { Thread t = new MonThread(); t.start(); t.join(); // attend la fin de lexcution du Thread // (i.e la fin de lexcution de run()) } }
! Si le thread effectue une entre/sortie bloquante (java.net.*, java.io.*), il faut fermer le canal (flux, socket)
! Il nexiste pas de mthode pour interrompre un thread pendant quil effectue une entre/sortie sans fermer le canal dentre/sortie (sauf si entre/sortie avec temporisateur)
31 09/02/2009 Master SAR - M1 SRCS - Java 32
09/02/2009
09/02/2009
33
09/02/2009
34
! Lexclusion mutuelle seffectue sur un objet, i.e lexclusion concerne toutes les synchronisations sur cet objet
Peut concerner des codes diffrents
36
Exemple : tous les thread attendent que tous les thread soient dmarrs (attente dun vnement)
! Threads : attendent que le boolean partag ready passe true while(!shared.ready) { ??? dort(); ??? } ! Main : dmarre les threads est passe le boolean ready true shared.ready = true; $ Problme : comment viter lattente active (i.e comment endormir les thread)
Autres remarques
La JVM garantie un accs atomique tous les types primitifs sauf long et double
09/02/2009 Master SAR - M1 SRCS - Java 37
09/02/2009
38
Ces mthodes ncessitent un accs exclusif lobjet ! utiliser avec mthode ou bloc synchronized
! synchronized(obj) { obj.wait(); } ! synchronized(obj) { obj.notify(); }
Notify() :
! Si il existe des threads qui excute wait(), rveilles en un unique ! Sinon, ne fait rien
Ces mthodes peuvent tre interrompues (Thread.interrupt()) entourer dun try { .. } catch(InterruptedException e) { }
09/02/2009 Master SAR - M1 SRCS - Java 39
09/02/2009
40
09/02/2009
Deux approches :
! Pool statique : le nombre de threads du pool ne change jamais ! Pool dynamique : le nombre de threads du pool sadapte dynamiquement au nombre de clients (tout en restant limit)
public void server() { while(cont) { Client client = attendClient(); synchronized(pool) { prochainClients.push(client); pool.notify(); } } }
09/02/2009
43
09/02/2009
44
09/02/2009
45
09/02/2009
46
4. Programmation rseau
a. b. c. d. Introduction et rappels sur les sockets Sockets en mode flux Sockets en mode datagram Sockets en mode multicast
Application A Socket
send() receive()
message
Application B Socket
# Une socket est caractrise par une adresse # Plusieurs domaines de sockets existent :
! Socket Unix (local) = un chemin dans le systme de fichier ! Socket Inet (rseau TCP, UDP ou IP) = adresse IP + port
09/02/2009
47
09/02/2009
48
# Sockets en Java : uniquement oriente transport (couche 4) # Deux API pour les sockets
! java.net : API bloquante (tudi ici) ! java.nio.channels (> 1.4) : API non bloquante (non tudie dans ce cours)
09/02/2009 Master SAR - M1 SRCS - Java 49
Adresse de Socket = Adresse IP + port Une socket communique avec une autre socket via son adresse
! Flux : une socket se connecte une autre socket via son adresse de socket ! Datagram : une socket envoie/reoit des donnes /dune autre socket identifie par son adresse de socket
09/02/2009
52
Client 2
Client 1
Client 3
Pool de connexion
public class Main { public static void main(String args[]) { byte ip[] = {195, 83, 118, 1 }; InetAddress addr = InetAddress.getByAddress(ip); InetSocketAddress saddr0 = new InetSocketAddress(addr, 21); InetSocketAddress saddr1 = new InetSocketAddress("ftp.lip6.fr", 21); }}
09/02/2009
55
09/02/2009
Client 4
56
Problme :
Dispatcher Client
09/02/2009
57
09/02/2009
58
Proprits
! Taille des messages quelconques ! Envoi en gnral bufferis (i.e. un envoi OS correspond plusieurs critures Java) ! Pas de perte de messages, pas de duplication ! Les messages arrivent dans lordre dmission ! Contrle de flux (i.e. bloque lmetteur si le rcepteur est trop lent) ! Pas de reprise sur panne Trop de perte ou rseau satur ! connexion perdue
Client 1
ServerSocket
send/receive
Client 2
60
sc = sa.accept();
connexion
09/02/2009
61
09/02/2009
62
09/02/2009
63
09/02/2009
64
Proprits
! ! ! ! ! ! ! Taille des messages fixe et limite (64ko) envoi non bufferis Possibilit de perte de messages, Duplication Les messages narrivent pas forcement dans lordre dmission Aucun contrle de flux Pas de dtection de panne (mme pas assur que les messages arrivent) Faible latence (car aucun contrle de flux, pas de connexion)
SocketImpl
" Dfinir une sous-classe de SocketImpl " Dfinir une classe qui implante SocketImplFactory interface SocketImplFactory { SocketImpl createSocketImpl(); } " Associer notre SocketImplFactory la factory par dfaut avec static void setSocketFactory(SocketImplFactory fac);
Nombreuses utilisations :
! DNS, TFTP, RIP ! Base pour la construction de IP Multicast
65 09/02/2009 Master SAR - M1 SRCS - Java 66
Client sc = new DatagramSocket(); InetAddress server = InetAddres.getByName(#nom); byte msg[] = "Hello, World!!!".getBytes(); sc.send( new DatagramPacket(msg, 0 msg.length, server, #port);
$Attention : si la taille du buffer de rception est trop petite, la fin du message est perdu!
09/02/2009 Master SAR - M1 SRCS - Java 67
09/02/2009
09/02/2009
69
09/02/2009
70
rcepteur
09/02/2009
71
09/02/2009
72
Rcepteur :
! Sabonne une adresse de classe D (! abonnement de la machine) MulticastSocket.joinGroup(InetAddress group); ! coute sur un port donne (! abonnement de lapplication) ! Se dsabonne de la classe D avant de quitter MulticasrSocket.leaveGroup(InetAddress group); ! Peut rejoindre et quitter le groupe multicast tout instant
09/02/2009 Master SAR - M1 SRCS - Java 74
09/02/2009
73
09/02/2009
75
09/02/2009
76