Académique Documents
Professionnel Documents
Culture Documents
' $
Stage Java
Emmanuel Chailloux
mél : Emmanuel.Chailloux@lip6.fr
www : http://cadillac.lip6.fr/~emmanuel
Slide 1
du 29 juin au 3 juillet 1998
UFR d’Informatique
Université Pierre et Marie Curie
www : http://www.ufr-info-p6.jussieu.fr
& %
' $
Organisation
& %
J1 Préambule 2
' $
Prérequis
& %
' $
Objectifs
& %
J1 Préambule 3
' $
Plan du stage
& %
J1 Préambule 4
' $
Bibliographie
' $
Remerciements
& %
' $
& %
J1 Présentation générale 6
' $
JAVA
• Simple
• Orienté Objet
• Typé
• Compilé/Interprété
• Indépendant de l’architecture machine
Slide 9
• Distribué
• Processus Légers (Threads)
• Robuste
• Petit
• Rapide
• Sûr
• à chargement dynamique
& %
J1 Présentation générale 7
' $
Historique
& %
J1 Présentation générale 8
' $
Mise en Oeuvre
toto.class
Java BC
INTERNET
stdin BC stdout
Slide 11 C
stderr
BC
appletviewer
HTTP-browser
& %
J1 Noyau Impératif 9
' $
JDK
BC BC
la JVM .o .o
C C
µ BC
µ
C .o
la biblio C .o
native
µ
BC
BC
BC
& %
J1 Noyau Impératif 10
' $
Noyau impératif
à la C
Expressions:
expression := variable
| operateur expression
Slide 13
| expression operateur
| expression operateur expression
| ( expression )
| (type de base) expression
| expression ? expression
: expression
| variable = expression
| variable operateur= expression
& %
J1 Noyau Impératif 11
' $
Types de base:
' $
Exemples d’expressions
z=18 x = x + 1
x += 1 x++
(byte)i (z % 3) << 2
(x<2) ? 2.7 : 3.14
Slide 15
(x != null) || (y >= 3.14)
(b = !b) & (( i ^= ~i) == 0)
s + "Hello" : concaténation
"an " + 1998 : avec conversion
' $
Instructions
& %
J1 Noyau Impératif 13
' $
Exemple d’instructions
i=1;
for (i=1; i < j ; i++) { while (i < j) {
if (i*i > j ) break; if (i*i > j ) break;
Slide 17 i++;
} }
switch (x % 5) {
case 0: { ... ; break;}
case 1: case 3: { ...; break;}
default: {... }
}
& %
' $
& %
J1 Noyau Impératif 14
' $
Variables locales
int w = J + 4;
// float i = 3.14;
} // fin du bloc 2
{ double w = 3.14;
...}
} // fin du bloc 1
for (int i = 0; i < 10; i++) { ...}
& %
J1 Noyau Impératif 15
' $
Premier programme
/∗ premier programme
calcul de fibonacci
∗/
class Fibo {
' $
Tableaux
& %
J1 Noyau Impératif 17
' $
Tableau : un exemple
{ int [] ft;
int i;
int n = 8;
& %
J1 Noyau Impératif 18
' $
Tableaux de Tableaux
...
int [][] m,t;
int p = 4;
int q = 5;
& %
...
J1 Noyau Objet 19
' $
Tableaux (suite)
Slide 24 int [] [] a;
a = new int [5] [];
a[0] = new int[1];
a[1] = new int [ a[0].length + 1];
a[0][0] = 33;
a[2].length; // BOOM !!!!
Les tableaux sont des objets avec une classe associée.
& %
' $
& %
J1 Noyau Objet 20
' $
Généralités
Encapsulation:
Classes et Instances:
Slide 26
Surcharge:
Héritage:
Redéfinition et Liaison Retardée:
Polymorphisme et Sous-Typage:
& %
' $
Terminologie Objet
& %
J1 Noyau Objet 21
' $
Déclaration de Classes
& %
}
' $
Statique ou Dynamique
& %
J1 Noyau Objet 22
' $
& %
J1 Noyau Objet 23
' $
class ES {
}
Slide 31
class TestES {
& %
J1 Noyau Objet 24
' $
& %
' $
Constructeur
& %
J1 Noyau Objet 25
' $
Surcharge
& %
' $
Classe Point
class Point {
// variables d’instance
int x, y;
// constructeurs
Slide 35 Point(int a, int b){x=a;y=b;}
Point(){x=0;y=0;}
// methodes d’instance
void moveto (int a, int b){x=a;y=b;}
void rmoveto (int dx, int dy){x+=dx;y+=dy;}
void affiche(){ES.writeln("(" + x + "," + y + ")");}
double distance(){return Math.sqrt(x∗x+y∗y);}
}
& %
J1 Noyau Objet 26
' $
class Test {
& %
J1 Noyau Objet 27
' $
Héritage
& %
' $
Exemple d’Héritage
String c;
Slide 38
PointColore(){c="blanc";}
PointColore(int a, int b, String x){moveto(a,b);c=x;}
& %
J1 Noyau Objet 28
' $
Redéfinition
& %
J1 Noyau Objet 29
' $
this et super
& %
}
' $
& %
J1 Noyau Objet 30
' $
Liaison retardée
Slide 42
Intérêts :
• permet donc de modifier facilement le comportement d’une classe
• y compris pour une classe compilée (sans le source)
• autorise le polymorphisme d’inclusion (voir sous-typage)
& %
J1 Noyau Objet 31
' $
Exemple
class InputString{
String txt;
InputString(){txt="";}
String value(){return txt;}
& %
J1 Noyau Objet 32
' $
Exemple de redéfinition
& %
J1 Noyau Objet 33
' $
Exécution
class TestInput {
s1.input("login");
Slide 45 s2.input("passwd");
ES.writeln("\n\n");
ES.write(s1.value() + " a " +
s2.value());
ES.write(" comme mot de passe");
}
}
java TestInput
login : emmanuel
passwd : *******
emmanuel a pilpoil comme mot de passe
& %
J1 Gestion mémoire 34
' $
Polymorphisme
& %
' $
Relations
• Est-un (is-a) :
Slide 47 s’il est un descendant
• A-un (has-a) :
s’il possède une variable d’instance
Une difficulté de conception objet provient de la communication
entre objets!!!
& %
J1 Exceptions 35
' $
Mémoire et Egalité
& %
J1 Exceptions 36
' $
Exceptions
utilisée :
& %
J1 Exceptions 37
' $
Exceptions : Syntaxe
' $
Exemples d’exceptions
class Exemple1 {
public int division(int a,int b) {
return (a/b);
}
}
' $
{
try { return division aux(a,b); }
catch(Division par zero e) { return 0;}
finally {ES.writeln("on passe ici");}
Slide 52
}
}
La clause finally est facultative. Son code est
exécuté à la sortie du try.
& %
J1 Exercices d’application 40
' $
• Windows NT
• Solaris (Unix S5)
Slide 53
• SunOS (Unix BSD)
• jdk 1.1.6 sur Windows NT et Solaris
• SunOS utilisé comme terminal X
• Emacs sur toutes les machines
& %
' $
Premiers pas
Connexion:
& %
J1 Exercices d’application 41
' $
Conventions
& %
J1 Exercices d’application 42
' $
3 types de commentaires
/* un commentaire
sur plusieurs lignes
*/
Slide 56 /**
un commentaire special
pouvant etre traite
par javadoc
pour la construction de
la documentation
se place devant une classe
une interface, une methode
ou une variabel
*/
& %
J1 Exercices d’application 43
' $
Slide 57
Ensuite ecrire le programme suivant :
class P1 {
public static void main() {
System.out.printl("Bonjour!!!");
}
}
& %
et sauver le une fois écrit.
J1 Exercices d’application 44
' $
test de l’environnement
& %
J1 Exercices d’application 45
' $
Utilisation de ES
& %
J1 Exercices d’application 46
' $
& %
' $
Exercices
& %
J1 Exercices d’application 47
Exercices
C+/C-
On définit une classe arbitre qui possède une variable entière et les méthodes
suivantes : void nouveau() : qui choisit un nouveau nombre, String verif(int
a) qui retourne une chaine selon le nombre proposé.
Liste d’association
On cherche à définir des listes d’associations (ensemble de (clé,valeur)) per-
mettant la recherche d’une valeur par sa clé.
1
On représentera la liste par un tableau et un indice.
3. Tester ces classes à partir d’un programme principal
4. Ecrire une classe ListeAssocOpt qui hérite de la première, en ajoutant
un champs indiquant qu’elle peut être optimisée, une méthode optimise
qui effectue le travail (trie le tableau) permettant ensuite une recherche
rapide (dichotomique) en modifiant en conséquence la recherche.
5. Tester cette nouvelle classe.
' $
& %
Jeu de la vie
1. Ecrire une classe Cell contenant un champs booléen et une méthode
est vivante qui retourne son état.
2. Ecrire la classe Monde contenant l’ensemble des cellules sous la forme
dn tableau de cellules à deux dimensions.
Cette classe contiendra 2 types de remplissage : un aléatoire et un
deuxième manuel. Les autres méthodes seront void affiche() pour
l’affichage en mode texte, Cell get cell(x,y), void set cell(x,y,c),
int voisins(x,y), void gen suiv pour le calcul de la génération
suivante.
3. Enfin la classe JDLV sera le point d’entré du programme.
J1 Exercices d’application 49
/∗∗
@author Emmanuel Chailloux
@organization Universite Pierre et Marie Curie
@version 1.0
∗/
/∗∗
representation du monde des cellules
contient la taille du monde
un tableau de cellules correspondant
le numero de la generation
∗/
class Monde {
/∗∗
constructeur sans parametre : construit un monde de taille 20x8
∗/
Monde() {
maxx = 20;
maxy = 8;
m=new Cell[maxx][maxy];
monde vide();
/∗∗
constructeur avec taille : construit le monde de cette taille
∗/
Monde(int x, int y) {
maxx=x;
maxy=y;
m = new Cell[maxx][maxy];
monde vide();
}
/∗∗
alloue chaque cellule du monde
∗/
J1 Exercices d’application 50
/∗∗
remplissage aleatoire du monde
favorise les cases vides (80 %)
∗/
/∗∗
remplissage manuel du monde
on indique seulement les cellules vivantes en donnat leurs coordonnees
pour sortir on indique des coordonnees inexistantes
∗/
/∗∗
change le contenu d’une cellule du monde
∗/
m[x][y]=c;
}
/∗∗
demande le contenu d’une cellule du monde
∗/
/∗∗
retourne le tableau de cellules du monde
∗/
/∗∗
calcule le nombre de voissins d’une cellule
on suppose que le monde est un tore (chambre a air)
on calcule le nombre de cellules vivantes dans un carre 3x3, puis on soustrait
si la case centrale etait vivante.
∗/
/∗∗
calcul de la generation suivante
pour chaque cellule on calcule le nombre de voisins
puis on applique les regles de vie et de mort de la simulation
∗/
/∗∗
affiche la generation i
∗/
void affiche() {
for (int j=0; j<maxy; j++) {
for (int i=0; i<maxx; i++) {
if (m[i][j].est vivante())
ES.write("∗ ");
else
ES.write(". ");
}
ES.writeln();
}
ES.writeln("Generation "+num);
}
/∗∗
classe minimale pour les cellules
∗/
class Cell {
boolean val;
J1 Exercices d’application 53
Cell() {val=false;}
Cell (boolean b) {val = b;}
/∗∗
classe de l’application JDLV
∗/
class JDLV {
/∗∗
initialisation du monde :
taille et type de remplissage
toute la partie initialisation du monde est dans la methode init
∗/
/∗∗
determine la taille du monde et le type de remplissage
∗/
Monde m;
do {
ES.writeln("Appuyer sur la touche <A> pour un remplissage
J1 Exercices d’application 54
aleatoire");
ES.writeln(" ou <M> manuel");
s=ES.readln();
} while ((!(s.equals("A"))) && (!(s.equals("M"))));
/∗∗
boucle sans fin d’attente d’evenements
sortie en appuyant sur F (break)
∗/
while (true) {
m.affiche();
s=ES.readln();
if (s.equals("F")) break;
else m.gen suiv();
}
}
/∗∗
derniere methode appelee avant la sortie
∗/
/∗∗
point d’entree de l’application
∗/
}
J2 Interfaces 56
' $
• Interfaces
Slide 63 • sous-typage et polymorphisme
• paquetages
• modifieurs
• bibliothèque standard
& %
' $
Interfaces
& %
J2 Polymorphisme 57
' $
Implantation d’interfaces
Intérêts: :
• permet d’être vu de différentes manières
• ne nécessite pas d’hériter
• simule de l’héritage multiple (sans code)
& %
' $
& %
J2 Polymorphisme 58
' $
Sous-type
ST ≤ T : ST est sous-type de T :
une valeur ST peut toujours être utilisée à la place d’une valeur T !
Slide 67
En Java : une sous-classe est un sous-type
En effet une instance d’une sous-classe saura toujours répondre aux
messages que peuvent recevoir les instances de la classe ancêtre.
& %
' $
Conversion implicite
x = y; // OK
Pas de problème à l’exécution, le nouvel x saura répondre à tous les
messages de C.
& %
J2 Polymorphisme 59
' $
Conversion explicite
& %
' $
& %
J2 Polymorphisme 60
' $
Exemple
class TestC {
public static void main(String args[])
{
PointColore p0 = new PointColore();
Point p1 = new PointColore(3,4,"bleu");
& %
J2 Paquetages 61
' $
Polymorphisme
& %
' $
Paquetage
& %
collisions interdites.
J2 Modifieurs 62
' $
Paquetage (suite)
Sans rien préciser dans son programme, celui-ci est considéré faisant
partie du “paquetage anonyme”.
Slide 74
& %
' $
Modifieurs généraux
abstract final
doit être sous-classée C ne peut être sous-classée
Slide 75
doit avoir une implantation M ne peut être raffinée
V ne peut être modifiée
et toujours static :
M et V : méthode ou variable de classe.
(pas de this dans ces méthodes)
& %
J2 Modifieurs 63
' $
Listes:
abstract class List { // classe abstraite racine
// de l’arbre d’heritage
Slide 76 abstract boolean empty() ;
abstract int head() throws EmptyList;
abstract List tail() throws EmptyList;
abstract List cons(int x);
abstract void display();
}
& %
' $
& %
class Cons extends List {
J2 Modifieurs 64
' $
int car;
List cdr;
Cons(){car=0;cdr=Nil.NIL;}
Cons(int a, List b){car=a;cdr=b;}
& %
' $
final
& %
J2 Modifieurs 65
' $
Modifieurs de visibilité
C
M public C protected
Slide 80 V V
C
M default
V
M private M private
V protected V
& %
J2 Modifieurs 66
' $
Visibilité
// P.A.ja // Q.D.java
package P; package Q;
public class A { import P.*;
int i; class D {
} }
Slide 81
// P/B.java // Q/E.java
package P; package Q;
class B extends A { import P.*;
} class E extends A {
}
// P/C.java
package P;
class C {
}
& %
J2 Bibliothèque standard 67
' $
Représentation graphique
Slide 82 P D Q
C A
B E
& %
' $
& %
J2 Exercices d’application 68
' $
// classe C
int M1() { ...}
String M2() { ... this.M1() ... }
// Sous-classe SC de C
int M1() { autre code}
... main ... {
C x = new C();
SC y = new SC();
Slide 84
C z = y;
...
x.M1();
x.M2();
y.M1();
y.M2();
z.M1();
z.M2();
En particulier quelles sont les méthodes
déclenchées? Vous pouvez écrire un programme
& %
correspondant à ce squelette.
J2 Exercices d’application 69
' $
// class C { ...
int M(C c) { ...}
// sous classe SC de C
int M (C c) { ...}
int M (SC c) { ...}
Slide 85 void main ... {
C x = new SC();
SC y = (SC) x;
y.M(y) + y.M(x) +
x.M(x) // + x.M(y)
En particulier quelles sont les méthodes
déclenchées? Vous pouvez écrire un programme
correspondant à ce squelette avec des
affichages. Que se passe-t-il si on décommente
la dernière ligne?
& %
J2 Exercices d’application 70
' $
Interface
& %
' $
Classe abstraite
& %
J2 Exercices d’application 71
Calculateur de Bureau
Soit le début de la hiérarchie suivante :
class Div0 extends Exception {}
' $
Coercion de type
& %
Piles d’Objets
On suppose la définition suivante de l’exception :
' $
paquetage
Slide 89
Faire un paquetage des différents interfaces, classes pour utiliser les
piles précédentes.
& %
' $
Ressources
& %
J2 Exercices d’application 74
' $
& %
valeur. Ecrire la méthode env suivant qui calule une nouvelle
' $
& %
J3 Processus Légers 75
' $
• Processus légers
Slide 93
• Interface graphique : AWT
• Classes locales
• Applet
& %
' $
' $
Création et Exécution
2 possibilités :
• sous-classer la classe Thread
et redéfinir la méthode public void run()
Slide 95
MCThread x = new MCThread (); x.start();
• Implanter l’interface Runnable
et implanter public void run
MCTheadI x = new MCThreadI();
MCThreadI y = new Thread(x,"Nom"); y.start()
Quand start() retourne, la tâche termine.
& %
' $
• start() et stop()
• suspend() et resume()
Slide 96
• wait() et notify (synchronisation)
• sleep(i)
• yield()
• interrupt() (exception)
& %
J3 Processus Légers 77
' $
1. sans relation
Slide 97
2. avec relation mais sans synchronisation
3. relation d’exclusion mutuelle
4. relation d’exclusion mutuelle avec communication
& %
J3 Processus Légers 78
' $
Sans relation
public class SR {
public static void main ( String []s) {
Thread t1 = new Aff("Bonjour");
t1.start();
new Aff("Au revoir").start();
}
}
Slide 98
class Aff extends Thread {
String txt;
Aff (String s){txt=s;}
' $
& %
' $
Synchronisation
& %
J3 Processus Légers 80
' $
& %
' $
Communication
Slide 102
• o.wait() : relache le verrou et attend une notification
• o.notify() : relance une tâche en attente (une au hasard). Elle
doit en premier réacquérir le verrou.
• o.notifyAll() : relance toutes les tâches.
& %
J3 AWT 81
' $
Producteur/Consommateur :
& %
' $
& %
J3 AWT 82
' $
Hiérarchie de classes
Object
Button
Slide 105 Canvas
Checkbox Container
Choice
Label Panel
List
Window
Scrollbar
TextComponent
Applet
Frame Dialog
& %
' $
Composants
& %
J3 AWT 83
' $
Conteneurs
& %
J3 AWT 84
' $
Dessiner
import java.awt.∗;
import java.awt.event.∗;
class TestXframeD {
static public void main(String [] args) {
XframeD d = new XframeD();
d.dessine();
Slide 108 }
}
Canvas p;
XframeD() {
super("DESSIN");
p = new Canvas();
& %
J3 AWT 85
' $
p.setSize(400,300);
this.add(p);
this.pack();
this.show();
}
void dessine() {
Slide 109 Color c1 = Color.blue;
Color c2 = Color.red;
Graphics g = p.getGraphics();
g.drawString("Mon dessin",160,40);
& %
J3 AWT 86
' $
import java.awt.∗;
import java.awt.event.∗;
class TestXframe {
static public void main(String [] args) {
Xframe e = new Xframe();
e.init event();
Slide 110 }
}
& %
J3 AWT 87
' $
Xframe() {
super("LOGIN");
p = new Panel();
p.setSize(400,500);
login = new TextField(8);
passwd = new TextField(8);
p.add(new Label("Login : "));
p.add(login);
p.add(new Label("Password : "));
Slide 111 passwd.setEchoChar(’∗’);
p.add(passwd);
this.add(p);
this.pack();
this.show();
}
& %
J3 AWT 88
' $
Evénements
D1
C1
D2
Slide 112
C2
D3
C3
D4
C4
Source Délégué
& %
' $
Sources et délégués
& %
J3 AWT 89
' $
Evénements et Composants
& %
' $
Délégué
import java.awt.∗;
import java.awt.event.∗;
Slide 115
XframeE A;
AdaptateurAction(XframeE a) {
A=a;
}
' $
{ if ((A.login.getText().equals(A.monlogin)) &&
(A.passwd.getText().equals(A.monpasswd)))
{A.OK=true; A.good();}
Slide 116 else {A.nogood();}
}
}
}
& %
J3 AWT 91
' $
Enregistrement
import java.awt.∗;
import java.awt.event.∗;
class TestXframeE {
static public void main(String [] args) {
XframeE e = new XframeE();
e.init event();
}
Slide 117 }
boolean OK = false;
' $
void good() {
ES.writeln("C’est parti");
System.exit(0);
}
Slide 118
void nogood() {
ES.writeln("Essaie encore!!!");
}
& %
J3 AWT 93
' $
Classes locales
& %
' $
& %
J3 AWT 94
' $
import java.awt.∗;
import java.awt.event.∗;
import java.applet.∗;
' $
getGraphics().drawString("salut tout le monde",x,y);
}
}
Test3 1() {
MouseListener clic = new AdaptateurSouris();
Slide 122
addMouseListener(clic);
}
& %
J3 AWT 95
' $
& %
' $
import java.awt.∗;
import java.awt.event.∗;
import java.applet.∗;
Test3 2() {
MouseListener clic = new MouseAdapter () {
public void mousePressed (MouseEvent e)
{
int x = e.getX();
int y = e.getY();
System.out.println("x = " + x + " y = "+y);
& %
J3 Applets 96
' $
& %
' $
Applets
Slide 126
La classe Applet hérite de Panel et implante Runnable.
Une applet possède une zone graphique (conteneur Panel) qui
n’ouvre pas une nouvelle fenêtre.
& %
J3 Applets 97
' $
cycle de vie
init()⇒start()⇒stop()⇒destroy() où :
• init() : appelée au démarrage de l’applet(initialisation);
• start() : appelée pour lancer l’applet (après l’initialisation ou
Slide 127
après un stop()), effectue le travail;
• stop() : appelée pour arrêter l’applet (quand la page HTML
disparaı̂t);
• destroy() : appelée pour libérer les ressources allouées par
l’applet (juste avant la disparition de l’applet).
void paint(Graphics g) : sera appelée à chaque réaffichage.
& %
' $
Exécution
& %
J3 Applets 98
' $
Balise
<html>
<head> Exercices en Java
</head>
<body>
Slide 129
<H1> Test </H1>
<P>
<applet code="Test1" height=400 width=400>
<P><EM> Not a java-powered browser! </EM>
</applet>
</body>
</html>
& %
J3 Applets 99
' $
Applet dessin
import java.awt.∗;
import java.awt.event.∗;
import java.applet.∗;
g.setColor(Color.cyan);
g.drawOval(25,30,60,40);
g.drawOval(125,30,100,100);
}
& %
J3 Applets 100
' $
Applet login
import java.applet.∗;
import java.awt.∗;
import java.awt.event.∗;
& %
' $
' $
add(login);
add(new Label("Password : "));
passwd.setEchoChar(’∗’);
add(passwd);
login.addActionListener(RC);
passwd.addActionListener(RC);
}
Slide 133
public void good() {
resize(120,180);
this.getGraphics().drawString("c’est parti...",10,150);
}
' $
incorrecte",10,100);
Slide 134 }
}
& %
J3 Exercices 102
' $
Producteur/Consommateur
& %
4. Ecrire le programme principal pour 1 entrepot, 1 usine et 1
' $
concessionaire.
& %
J3 Exercices 103
' $
Calculateur d’expressions
Slide 137 La classe suivante est une (mini) interface pour l’entrée d’une formule
dans une applet.
• intégrer la avec la classe LectExprAr et ExprAr
• tester la avec appletviewer etu un navigateur
& %
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
' $
Jeu de la vie
& %
J3 Exercices 105
' $
Éditeur de Bitmap
& %
un éditeur de bitmaps
On cherche à un écrire un petit éditeur de bitmap (à la manière de la com-
mande bitmap de X-window). Pour cela on représentera un bitmap par sa
taille (largeur et hauteur) et pour les pixels un tableau à 2 dimensions con-
tenant la couleur de chaque pixel.
package TP3;
import java.awt.∗;
###################-------------#######---------######
###################---------------###-------------##--
###-----###-----###---------------###-------------#---
##------###------##----------------###-----------##---
#-------###-------#-----------------###---------##----
#-------###-------#-----------------###--------##-----
--------###--------------------------###-------#------
--------###-------###############-----###----##-------
--------###-------###---------###------###--##--------
--------###-------###----------##-------###-#---------
--------###-------###-----------#-------#####---------
--------###-------###-----------#--------###----------
--------###-------###--------------------####---------
--------###-------###--------------------####---------
--------###-------###------#-----------##---###-------
--------###-------###------#----------##----###-------
--------###-------##########----------#------###------
--------###-------##########---------##-------###-----
--------###-------###------#--------##--------###-----
--------###-------###------#-------##----------###----
--------###-------###--------------#------------###---
------#######-----###-----------#######--------#######
------------------###---------------------------------
------------------###-----------#---------------------
------------------###-----------#---------------------
------------------###----------##---------------------
------------------###---------###---------------------
------------------###############---------------------
import java.io.∗;
/∗
∗ ouverture du fichier
∗/
J3 Exercices 108
try
{ in = new FileInputStream(file);}
catch(FileNotFoundException e) {return new Bitmap(0,0,0);}
/∗
∗ calcul du nombre de colonnes
∗/
try
{ while ((c = in.read()) 6= ’\n’) {nc++;}
nl++;
while ((c = in.read()) 6= -1){if (c == ’\n’) nl++;}}
catch (EOFException e) {System.out.println("par ici " +
nl);nl++;}
catch (IOException e) {return new Bitmap(0,0,0);}
finally {in.close();}
System.out.println("par la " + nl);
/∗
∗ lecture des donne’es
∗/
b= new Bitmap(nc,nl,10);
try
{ in = new FileInputStream(file);}
catch(FileNotFoundException e) {return new Bitmap(0,0,0);}
System.out.println("lecture reelle");
nc=0; nl=0;
try
{ while ((c = in.read()) 6= -1) {
if (c==’\n’) {nl++;nc=0;}
else {
if (c==cbg) {b.bitmap[nc][nl]=b.bg;}
else {b.bitmap[nc][nl]=b.fg;}
nc++;
}
}
}
catch(EOFException e) {return b;}
catch(IOException e) {return new Bitmap(0,0,0);}
finally {in.close();}
System.out.println(b);
return b;
J3 Exercices 109
}
J4 Persistance 110
' $
& %
' $
Persistance
& %
En jdk1.1 : mécanisme de sérialisation!!!
J4 Persistance 111
' $
Sérialisation
• classes de flux
Slide 142 – ObjectOutputStream : flux de sérialisation
– ObjectInputStream : flux de désérialisation
• interface
– Serializable : doit être implantée (vide) pour être sérialisé
& %
' $
Que stocke-t-on?
Le stockage contient :
• le nom et une clé (checksum) de la classe
• tous les champs (de données) sérialisables
Slide 143
La clé permet de vérifier la version de la classe.
Le modifieur transient permet d’indiquer qu’un champs ne doit pas
être sérialisé.
' $
Exemple
import java.io.∗;
Exemple20() {nom=null;autres=null;}
Exemple20(String n, Exemple20 e) {
Slide 144 nom=n;autres=e;
}
' $
try {
e.ajoute("machin");
e.ajoute("truc");
System.out.println("1 : "+e);
out = new ObjectOutputStream(new
& %
FileOutputStream("Exemple20.dat"));
J4 Persistance 114
' $
out.writeObject(e);
out.flush(); out.close();
e.detruit();
System.out.println("2 : "+e);
in = new ObjectInputStream(new
FileInputStream("Exemple20.dat"));
e.ajoute("bidule");
e.autres = (Exemple20)in.readObject();
in.close();
Slide 146 System.out.println("3 : "+e);
}
catch (java.lang.ClassNotFoundException
exc){System.err.println(exc);}
catch (StreamCorruptedException exc)
{System.err.println(exc);}
catch (IOException exc)
{System.err.println(exc);}
}
}
& %
J4 Distribution 115
' $
Exécution
java Execute
*
Slide 147
*
1 : truc::machin
2 : []
*
3 : bidule::truc::machin
* : trace de ajoute(..)
& %
J4 Distribution 116
' $
Programmation distribuée
& %
J4 Distribution 117
' $
Internet*
& %
----------------
J4 Distribution 118
' $
Protocoles Internet
& %
' $
Services Internet
' $
et le client :
creation de la socket (socket) : (TCP/UDP)
& %
J4 Distribution 120
' $
Classes
& %
' $
& %
J4 Distribution 121
' $
Exemple de client/serveur
Slide 155
Le serveur est construit à partir de 2 classes :
• Serveur : classe générique (au numéro du port près)
• Connexion : pour les canaux et le traitement
Lors d’une connexion d’un client au serveur (Serveur.run()) une
nouvelle instance de Connexion est créée.
& %
J4 Distribution 122
' $
Partie serveur
import java.io.*;
import java.net.*;
Serveur ()
Slide 156 { try
{ ecoute = new ServerSocket(PORT);}
catch (IOException e)
{System.err.println(e.getMessage());
System.exit(1);
}
System.out.println(
"Serveur en ecoute sur le port : "+PORT);
this.start();
}
& %
{ try
J4 Distribution 123
' $
{while (true)
{Socket client=ecoute.accept();
Connexion c = new Connexion (client);}}
catch (IOException e)
{System.err.println(e.getMessage());
Slide 157 System.exit(1);}
}
& %
J4 Distribution 124
' $
Partie Connexion
& %
J4 Distribution 125
' $
Partie client
import java.io.*;
import java.net.*;
& %
// ligne=ligne + ’\n’;;
' $
canalEcriture.println(ligne);
canalEcriture.flush();
ligne=canalLecture.readLine();
if (ligne == null)
{System.out.println("Connexion terminee"); break;}
System.out.println("!"+ligne);
}
Slide 160 }
catch (IOException e) {System.err.println(e);}
finally
{ try {if (s != null) s.close();}
catch (IOException e2) {}
}
}
}
& %
J5 Exercices 126
' $
Execution
& %
Connexion terminee
' $
Communication avancée
& %
J5 Objets distribués 127
' $
& %
' $
Objets distribués
Possibilités:
& %
J5 Objets distribués 128
' $
• transparence référentielle
& %
' $
RMI
& %
J5 Objets distribués 129
' $
Structure générale
client serveur
^ ^
| |
| |
| |
Slide 167
v v
--------------- ---------------
| stub | | skeleton |
-----------------------------------
| couche des references |
-----------------------------------
| couche transport |
& %
-----------------------------------
' $
Serveur
& %
J5 Objets distribués 130
' $
Paquetages
& %
' $
Interface:
import java.rmi.*;
public interface PointRMI extends Remote {
Slide 170
void moveto (int a, int b) throws RemoteException;
& %
}
J5 Objets distribués 131
' $
Implantation de l’interface:
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
int x,y;
PointD(int a, int b) throws RemoteException {x=a;y=b;}
PointD() throws RemoteException {x=0;y=0;}
& %
throws RemoteException
' $
{ x=a; y=b;}
& %
J5 Objets distribués 132
' $
Compilation
& %
' $
création et enregistrements
System.setSecurityManager(new RMISecurityManager());
try {
& %
PointD p0 = new PointD();
J5 Objets distribués 133
' $
Naming.rebind("//youpou.lip6.fr/point0",p0);
Naming.rebind("//youpou.lip6.fr/point1",p1);
System.out.println("Objets distribues ’p0’ " +
Slide 175 "et ’p1’ sont enregistres");
}
catch (Exception e) { e.printStackTrace();
}
}
}
& %
' $
Commentaires
& %
J5 Objets distribués 134
' $
un client
import java.rmi.*;
public class Client {
public static void main( String argv[]) {
String url0="rmi://youpou.lip6.fr/point0";
String url1="rmi://youpou.lip6.fr/point1";
try {
PointRMI p0 = (PointRMI)Naming.lookup(url0);
PointRMI p1 = (PointRMI)Naming.lookup(url1);
p0.affiche(); p1.affiche();
Slide 177 p0.rmoveto(7,12);
p1.rmoveto(5,6);
p0.affiche(); p1.affiche();
if (p0.distance() == p1.distance())
System.out.println("c’est le hasard");
else
System.out.println("on pouvait parier");
}
catch (Exception e) {
System.err.println("exception : " +
e.getMessage());
e.printStackTrace();
& %
} } }
J5 Objets distribués 135
' $
Exécution
1ère exécution:
(0,0)
(3,4)
(7,12)
Slide 178 (8,10)
on pouvait parier
2ème exécution:
(7,12)
(8,10)
(14,24)
(13,16)
on pouvait parier
& %
J5 Objets distribués 136
' $
Exceptions
& %
' $
port de communication
rmiregistry 2000&
et il faut indiquer ce nouveau port aux URL employées :
//youpou.lip6.fr:2000
& %
J5 Exercices 137
' $
CORBA
& %
' $
IDL
' $
Client HTTP
& %
en a.
HTTP/n code s
où n est le numéro de version du protocole, et code un code indiquant soit
que la page est bonne code=200) ou bien qu’il y a une erreur (dans les 400
et plus).
J5 Exercices 139
' $
Points distants
Slide 184
1. Compiler les interfaces et les classes.
2. Compiler avec rmic pour construire les stubs et skeletons.
3. Compiler le serveur de points.
4. Lancer le sur une machine Solaris.
5. Compiler puis exécuter le client sur une machine Windows NT.
& %
' $
Monde de robots
Slide 185 Sur un monde découpé en cases se déplacent des robots, il existe
différents types de robots : le robot fixe, le robot fou, le robot poli, le
robot pressé, le robot humanoide, . . .
& %
J5 Exercices 140
2. Ecrire une version RMI où un monde est un objet distant enregistré.
Un client graphique (applet) permet d’ajouter des robots au monde
distant et affiche les positions de tous les robots du monde.