Support Java 2022 - 2023 Esgis Irt3
Support Java 2022 - 2023 Esgis Irt3
3)L’héritage
Un autre concept important en P.O.O. est celui d’héritage. Il permet de définir une nouvelle
classe à partir d’une classe existante, à laquelle on ajoute de nouvelles données et de
nouvelles méthodes. La conception de la nouvelle classe, qui hérite des propriétés et des
méthodes, peut ainsi s’appuyer sur des réalisations antérieures parfaitement au point et les
spécialiser à volonté. Comme on peut s’en douter, l’héritage facilite largement la réutilisation
de produits existants.
Cette technique s’appliquera aussi bien aux classes que vous serez amenés à développer
qu’aux très nombreuses classes fournies en standard avec Java.
4)Le polymorphisme
En Java, comme généralement, en P.O.O., une classe peut redéfinir certaines des méthodes
héritées de sa classe de base. Cette possibilité est la clé du polymorphisme, c’est-à-dire la
possibilité de traiter de la même manière des objets de types différents, pour peu qu’ils soient
issus de classes dérivées d’une même classe de base. Plus précisément, on utilise chaque objet
comme s’il était de cette classe de base, mais son comportement effectif dépend de sa classe
effective (dérivée de cette classe de base), en particulier de la manière dont ses propres
méthodes ont été redéfinies.
Les étapes nécessaires pour l’exécuter dans une fenêtre DOS sans outils de développement
visuel (uniquement avec le JDK) sont:
C:> javac Hello.java <= Compilation : création de Hello.class
C:> java Hello <= Lancement du programme à partir de la machine virtuelle
Hello World
C:>
Eclipse nécessite une machine virtuelle Java (JRE) pour fonctionner. Mais pour compiler du
code Java, un kit de développement (JDK) est indispensable.
Eclipse est un projet, décliné et organisé en un ensemble de sous-projets de développements
logiciels, de la fondation Eclipse visant à développer un environnement de production de
logiciels libre qui soit extensible, universel et polyvalent, en s'appuyant principalement sur
Java.
b. NetBeans
Créé en 1996 sur les bases d'un projet étudiant, NetBeans est environnement de
développement intégré (ou IDE) racheté par Sun Microsystèms (eux-mêmes racheté par
Oracle en 2009).
Son parcours explique ainsi sa forte orientation pour le Java bien que le logiciel, qui continue
à évoluer, permette également de gérer des développements en JavaScript, Python, XML,
RubyC et C++ ainsi qu'en PHP et HTML5.
NetBeans IDE vous permet non seulement de créer d'étonnantes applications de bureau, mais
aussi des applications mobiles et web pour téléphones intelligents et ordinateurs de poche,
sans avoir à changer la programmation.
3)L’utilitaire JavaDoc
Javadoc est un outil développé par Oracle, permettant de créer une documentation d'API en
format HTML depuis les commentaires présents dans un code source en Java.
Conçu à l'origine par Sun MicroSystems (avant son rachat par Oracle), javadoc est le standard
industriel pour la documentation des classes Java. La plupart des IDE génèrent
automatiquement la javadoc au format HTML.
Tag Description
@author Nom du développeur
@deprecated
Marque la méthode comme dépréciée. Certains IDEs créent un
avertissement à la compilation si la méthode est appelée.
@exception
Documente une exception lancée par une méthode — voir aussi
@throws.
@param Définit un paramètre de méthode. Requis pour chaque paramètre.
Documente la valeur de retour. Ce tag ne devrait pas être employé
@return pour des constructeurs ou des méthodes définies avec un type de
retour void.
@see Documente une association à une autre méthode ou classe.
@since
Précise à quelle version de la SDK/JDK une méthode a été ajoutée à la
classe.
@throws
Documente une exception lancée par une méthode. Un synonyme pour
@exception disponible depuis Javadoc 1.2.
@version Donne la version d'une classe ou d'une méthode.
boolean b = true ;
char c1 = 'a' ;
char c2 = 48 ; // Unicode
int i2 = 'a' ;
String s = "Bonjour \n" ;
Attention : String n'est pas un type de base, mais une classe. Nous reviendrons dessus plus
tard. En tout état de cause, String n'a rien à voir avec un tableau ou un pointeur.
3)Les opérateurs
Ce sont les mêmes que dans le langage C++ :
Types d'opérateurs Listes des opérateurs Types concernés
Binaire +, -, *, /, %
Arithmétiques Unaire -, --, ++ Entiers et réels (sauf le modulo)
Etendus +=, -=, *=, /=
Binaires bit à bit ~, &, ^,<<, >> Entiers
Logiques !, &&, || Booléens
De comparaison (le résultat est de type ==, !=, <, <=, >, >= Tous les types (y compris les références
boolean) d'objets)
4)Conversion de type
Il existe les conversions implicites et explicites possibles:
class SwitchApp {
public static void main(String args[]) {
d) While
class WhileApp {
public static void main(String args[]) {
int c ;
do {
System.out.println("Entrez un nombre positif <= 5") ;
c = LireEntier( ) ;
} while ( c <= 0 || c > 5 ) ;
while ( c > 0 ) System.out.println( c-- ) ;
}
public static int LireEntier() { /*fonction à definir */ }
}
e) For
public class InstructionFor
{
public static void main (String args[])
{
for (int i=1, j=1; (i <= 5); i++, j+=i)
{
System.out.println ("i= " + i + " j= " + j);
}
}}
f) Break et continue
break : L’instruction break permet de sortir d’une structure de boucle avant que la
condition du test soit respectée. Quand la boucle rencontre une instruction break, elle
se termine immédiatement en ignorant le code restant. Exemple :
int x = 0;
while (x < 10){
System.out.println("Bouclage");
x++;
if (x == 5)
break;
else
System.out.println("Boucle continue");
}
6)Les commentaires
Java supporte deux types de commentaires :
Tout ce qui se trouve entre /* et */ est un commentaire
Tout ce qui sur une ligne se trouve après // est un commentaire
class Hello { /* ceci est uncommentaire */
public static void main(String argv[])
{
System.out.println("Hello World") ; // autre commentaire
}
}
I. CLASSES ET OBJET
1)Les classes
Tout d’abord, il faut faire la distinction entre les classes et les objets. Une classe est la
définition d’un type, alors que l’objet est une déclaration de variable.
Le processus de création d’un objet à partir d’une classe est appelé instanciation d’un objet
ou création d’une occurrence d’une classe.
a. Définition
La classe regroupe la définition des membres de classe, c’est-à-dire :
- des méthodes, les opérations que l’on peut effectuer ;
- des champs ou attribut, les variables que l’on peut traiter ;
- des constructeurs, qui sont des méthodes permettant de créer des objets ;
b. Déclaration et instanciation des classes
Une classe Java peut être très simple. Voici la définition d’une classe vide :
class MaClasse {
}
Evidemment, cette classe n’est pas encore utile, mais elle est correcte dans Java. Mais
commençons par étudier la syntaxe de l’instanciation d’une classe. Pour créer une occurrence
de cette classe, il faut créer une référence :
MaClasse monObjet;
Mais cette instruction n’affecte ni mémoire ni autres ressources à l’objet. Elle crée une
référence appelée monObjet, mais n’instancie pas l’objet. C’est le rôle de l’opérateur new.
monObjet = new MaClasse();
Après l’exécution de cette ligne de code, il est possible d’accéder aux variables et aux
méthodes membres de la classe avec l’opérateur “.”.
Une fois l’objet créé, vous n’avez pas à vous préoccuper de sa destruction. Dans Java, les
objets sont automatiquement éliminés par le Garbage collector. Dès que la référence à un
objet (c’est-à-dire la variable) sort de la portée, la machine virtuelle libère automatiquement
toutes les ressources affectées par l’opérateur new.
c. Les attributs (les champs)
Les attributs (ou champs) sont les données contenues dans les objets d'une certaine classe.
Déclaration et initialisation
Voici un exemple plus complexe de classe, décrivant des objets représentants des dates et
contenant trois attributs :
A l'appel, la machine virtuelle Java détermine quelle est la méthode dont la liste de paramètres
est la plus proche des paramètres effectivement envoyés. Dans le cas d'un appel de méthode
avec des types ne correspondants pas exactement, des conversions implicites peuvent être
effectuées.
short s ;
t.print( s ) ; // => La première méthode est appelée avec une conversion de s en int
class MathTool {
final static double PI = 3.14 ;
class Test {
void methode1() {
double i = MathTool.power(6) ; /* invocation d'une méthode static sur une classe */
}
void methode2() {
MarhTool tool = new MathTool() ;
double i = tool.power(6) ; /* idem mais sur un objet. La première méthode est
plus logique */
}
Enfin, la première utilisation du mot clé static concerne la méthode main, dont une version
peut être définie pour chaque classe et qui sera la première méthode appelée, si et seulement si
on lance la Machine Virtuelle Java directement avec cette classe.
class Voiture {
// Méthode utilisée si cette classe est exécutée directement
public static void main(String args[]) {
Voiture v1 = Voiture.getVoiture(435)
v1.print() ;
}
// Gestion des objets de la classe
static ListeDeVoiture liste ;
e. Les constructeurs
Un constructeur est une méthode particulière qui permet d'initialiser les objets de la classe
concernée. Chaque fois qu'un objet est construit avec l'opérateur new, un constructeur est
automatiquement appelé.
L'intérêt principal d'un tel mécanisme est le contrôle de la validité des données membres qu'il
procure. En effet, il est possible (et même conseillé) de tester la valeur que l'on assigne à une
donnée membre, c'est-à-dire que l'on effectue un test de validité de la valeur de l'argument
avant de l'affecter à l’attribut.
Attention : Si une méthode est invoquée sur une référence égale à null, cela déclenche une
erreur du type NullPointerException.
6)Les tableaux
En programmation, on parle de tableau pour désigner un ensemble d’éléments de même type
désignés par un nom unique, chaque élément étant repéré par un indice précisant sa position
au sein de l’ensemble.
a) Création et utilisation d’un tableau
Un tableau dans Java est toujours un objet, même si les données de ce tableau appartiennent à
un type de base. La taille d'un tableau est fixée définitivement à sa création.
Un tableau étant un objet, il doit être alloué avec l'opérateur new, il est détruit
automatiquement par le Garbage Collector lorsqu'il n'est plus référencé et il est
systématiquement passé par référence lors de l'appel d'une méthode.
// tableau d'entiers
int tab [] = new int[10] ;
b) Affectation de tableaux
Java permet aussi de manipuler globalement des tableaux, par le biais d’affectations de leurs
références.
Considérons ces instructions qui créent deux tableaux d’entiers en plaçant leurs références
dans t1 et t2 :
int [] t1 = new int[3] ;
for (int i=0 ; i<3 ; i++) t1[i] = i ;
int [] t2 = new int[2] ;
for (int i=0 ; i<2 ; i++) t2[i] = 10 + i ;
Exécutons maintenant l’affectation :
t1 = t2 ; // la reference contenue dans t2 est recopiee dans t1
Dorénavant, t1 et t2 désignent le même tableau. Ainsi, avec :
t1[1] = 5 ;
System.out.println (t2[1]) ;
on obtiendra l’affichage de la valeur 5, et non 11.
Il est très important de noter que l’affectation de références de tableaux n’entraîne aucune
recopie des valeurs des éléments du tableau. On retrouve exactement le même phénomène que
pour l’affectation d’objets.
Remarques :
Les classes Chat et Tigre héritent de la classe Felin, ce qui signifie que les instances
de Chat et Tigre seront aussi des Félins. En particulier les deux classes filles héritent
de l'attribut afaim, et des méthodes parler() et appeler().
On remarque dans chaque classe fille que la méthode parler() est redéfinie et que de
nouveaux attributs et méthodes sont définis (race, chasser()). Les attributs d'une classe
dérivée comprennent bien les attributs hérités ET des attributs propres (idem pour les
méthodes).
Felin
Chat Tigre
Une variable qui référence un objet d'une certaine classe peut référencer un objet de
n'importe laquelle de ses sous-classes (un objet membre d'une sous-classe est aussi
membre de la super-classe) : c'est le cas ici pour la variable qui référence un objet de
type Felin qui peut donc contenir la référence sur un Tigre.
Il est possible d'interdire qu'une classe puisse être héritée : il suffit de déclarer cette
classe final.
Il est possible d'interdire qu'une méthode soit redéfinie dans une sous-classe : il
suffit de déclarer cette méthode final.
Remarque
Une méthode d’une classe dérivée n’a pas accès aux membres privés de sa classe de base.
En Java, le constructeur de la classe dérivée doit prendre en charge l’intégralité de la
construction de l’objet. S’il est nécessaire d’initialiser certains champs de la classe de base et
qu’ils sont convenablement encapsulés, il faudra disposer de fonctions d’altération ou bien
recourir dans la plupart du temps à un constructeur de la classe de base. Pour ce faire, il est
toutefois impératif de respecter une règle imposée par Java : Si un constructeur d’une classe
dérivée appelle un constructeur d’une classe de base, il doit obligatoirement s’agir de la
première instruction du constructeur et ce dernier est désigné par le mot-clé super.
2)Accès à la super-classe d'une classe : super(…)
Le mot clé super permet d'accéder à la version non redéfinie des attributs et méthodes de la
super-classe. Il permet aussi, s'il est utilisé comme première instruction dans un constructeur,
d'appeler un des constructeurs de la classe mère, avec ou sans paramètres.
class Mere {
int attribut ;
Mere() { attribut = 1 ; }
Mere(int attribut) ( this.attribut = attribut ; }
void print() { System.out.println("base" + attribut) ; }
}
class fille extends Mere {
boolean flag ;
III. Le Polymorphisme
Une méthode polymorphe est une méthode déclarée dans une super-classe et redéfinie par une
sous-classe. Dans Java, toute méthode est par défaut polymorphe.
Les méthodes final ne peuvent être redéfinies et ne sont donc pas polymorphes (définir une
méthode final est utile pour optimiser le byte code et pour des raisons de sécurité).
Il s’agit d’un concept extrêmement puissant en P.O.O., qui complète l’héritage. On peut
caractériser le polymorphisme en disant qu’il permet de manipuler des objets sans en
connaître (tout à fait) le type.
D’une manière générale, Java permet d’affecter à une variable objet non seulement la
référence à un objet du type correspondant, mais aussi une référence à un objet d’un type
dérivé. On peut dire qu’on est en présence d’une conversion implicite (légale) d’une référence
à un type classe T en une référence à un type ascendant de T ; on parle aussi de compatibilité
par affectation entre un type classe et un type ascendant.
class Zoo {
int MAX = 10 ;
Felin[] liste ;
int compteur = 0 ;
Cirque( int taille ) { MAX = taille ; liste = new Felin[MAX] }
void addFelin( Felin newfelin) {
if (compteur < MAX) liste[compteur++] = newfelin ;
else /* traitement d'erreur */
}
final void appeler() { // cette méthode ne peut être redéfinie dans une sous-classe
for ( int i=0 ; i<compteur ; i++ ) liste[i].parler() ; // appel polymorphe
}
}....
Zoo zoo = new Zoo(10) ;
zoo.addFelin(new Tigre()) ;
zoo.addFelin(new Chat()) ;
…
zoo.appeler() ;
…
En résumé, le polymorphisme en Java se traduit par :
• la compatibilité par affectation entre un type classe et un type ascendant,
• la ligature dynamique des méthodes.
Prenons le cas d’une classe animal crée pour servir dans l’héritage pour créer des classes des
animaux comme Chat,Chien,Loup… mais cela n'a pas de sens de créer des objets Animal. Il
faut donc empêcher l'instanciation de la classe Animal.
Pour cela il suffit de déclarer la classe Animal abstract.
abstract public class Animal {
...
}
Dès lors le compilateur interdira de créer une instance de ce type. Il reste cependant possible
d'utiliser des classes abstraites comme superclasse ou avec le polymorphisme.
Une classe abstraite est une classe dont la définition est précédée du mot clé abstract. Une
classe abstraite ne peut jamais être directement instanciée avec l'opérateur new pour créer un
nouvel objet : seules des classes filles non abstraites peuvent l'être. Lorsqu'une classe possède
une ou plusieurs méthodes abstraites, elle doit elle-même être déclarée abstraite, mais la
Date String
… Thread event Button
… List
ActionEvent …
ActionEvent
…
Dans cet exemple :
La classe Button appartient au package java.awt (sous-package du package java)
La classe ActionEvent appartient au package java.awt.event
Il y a deux manières d'utiliser une classe stockée dans un package :
En utilisant le nom du package suivi du nom de la classe
java.util.Date now = new java.util.Date() ;
System.out.println(now) ;
En utilisant le mot clé import pour importer (inclure) le package auquel appartient la
classe
import java.util.Date ; // Doit être en tête du fichier !!
… // Ne permet d'importer que la classe Date de java.util
Date now = new Date() ;
System.out.println(now) ;
On peut généralement utiliser l'une ou l'autre de ces deux méthodes, mais il existe un cas ou
l'on doit obligatoirement utiliser la première : si deux classes portant le même nom sont
définies dans deux packages différents.
Java importe automatiquement le package java.lang qui permet d'utiliser des classes comme
Thread ou System.
Remarque : System est une classe de java.lang, out est une variable statique de cette classe (de
type PrintStream) et println est une méthode de la classe PrintStream.
2)La structure de stockage des classes et des packages
Les fichiers sources Java ont pour extension .java, les fichiers compilés (donc contenant du
byte code) ont pour extension .class.
Seules les classes public sont accessibles d'un autre package, ou d'un autre fichier (les autres
classes ne sont pas connues en dehors de leur fichier). Il ne peut y avoir qu'une et une seule
classe public dans un fichier et cette classe doit porter le même nom que le fichier (en
respectant la casse).
Les fichiers des classes qui font partie d'un package doivent être placés dans une hiérarchie de
répertoires correspondant à la hiérarchie des packages. L’attribution d’un nom de paquetage
se fait au niveau du fichier source ; toutes les classes d’un même fichier source appartiendront
donc toujours à un même paquetage Ils doivent obligatoirement commencer par une
déclaration précisant le nom de leur package, précédé du mot clé package.
// Fichier Classe1.java dans le répertoire test/util/
package test.util ;
public class Classe1 {
public void test() { … } }
public double resultat() throws PasDeSolution { // Cette méthode propage une exception
double discriminent = b*b-4*a*c ;
if (discriminent < 0) throw new PasDeSolution() ;
return ( b + Math.sqrt(discriminent) ) / (2 * a) ;
}
}
…
void calcul() throws PasDeSolution {
Equation eq = new Equation(1,0,1) ;
Eq.resultat() ;
}
// Cette méthode doit déclarer la propagation de l'exception PasDeSolution que Eq.resultat() peut
// déclencher, car elle ne la traite pas localement.
Remarque : Nous constatons dans cet exemple qu'un objet Exception peut être directement
affiché avec la méthode System.out.println(). L'affichage consiste en une chaîne de caractères
expliquant la nature de cette exception.
Introduction
Au début on utilisait le package AWT pour créer des interfaces graphiques. AWT
utilise directement les composants du système. Cela permet d'être rapide puisque
c'est le système qui s'occupe de la création. Néanmoins, Java se voulant portable,
on est obligé de limiter les composants AWT aux composants qu'on trouve sur tous
les systèmes d'exploitation. C'est pour pallier à ce manque de composants que
Swing a été introduit dans Java 1.2. Cette fois, les composants sont entièrement
dessinés en Java, on peut donc créer autant de composants que l'on veut. C'est
grâce à cela qu'on peut trouver maintenant un tableau ou un arbre dans les
interfaces graphiques en Java. On peut noter que tous les composants Swing
(reconnaissables à leur nom préfixés par J) héritent des composants AWT.
1) Les conteneurs
Les conteneurs contiennent d’autres objets qui peuvent être eux-mêmes des
conteneurs. Ils sont responsables de la disposition des objets qu'ils délèguent à un
gestionnaire de disposition (LayoutManager). La classe de base des conteneurs est
Container qui dérive de Component. Les conteneurs sont aussi des composants. En
tant que tels, ils vous laissent interagir avec eux, c'est-à-dire définir leurs propriétés,
appeler leurs méthodes et répondre à leurs événements.
JWindow : C'est la fenêtre la plus basique. C'est juste un conteneur que vous
pouvez afficher sur votre écran. Il n'a pas de barre de titre, pas de boutons de
fermeture/redimensionnement et n'est pas redimensionnable par défaut.
JDialog : C'est une fenêtre destinée aux boîtes de dialogue. Ce type de fenêtre
peut être modal, c'est-à-dire qu'elle bloque une autre fenêtre tant qu'elle est
ouverte. Elles sont destinées à travailler de paire avec la fenêtre principale.
JFrame : C'est une fenêtre destinée à être la fenêtre principale de votre
application. Elle n'est dépendante d'aucune autre fenêtre et ne peut pas être
modale. Elle a une barre de titre et peut accueillir une barre de menu. Elle possède
un bouton de fermeture, un bouton de redimensionnement et un bouton pour
l'iconifier.
JPanel pour contenir des composants.
JApplet pour les applets.
import javax.swing.JFrame;
public class SimpleFenetre extends JFrame{
public SimpleFenetre(){
super();
build();//On initialise notre fenêtre
}
private void build(){
setTitle("Ma première fenêtre"); //On donne un titre à l'application
setSize(320,240); //On donne une taille à notre fenêtre
2) Les composants
1) Les composants atomiques
La classe JComponent est une classe abstraite dérivée de la classe Container qui
encapsule les composants atomiques d'une interface graphique. Les principaux
composants atomiques offerts par Java sont les boutons, les cases à cocher, les
boutons radio, les étiquettes, les champs de texte, les boîtes de liste et les boîtes de
liste combinée.
Exemples
class MaFenetre extends JFrame {
private Jlabel MonTexte;
private JTextField MonChamp1 ;
public MaFenetre () {
super("Une fenetre avec une etiquette") ;
setBounds(10,40,300,200) ;
MonTexte = new Jlabel ("texte initial");
//création d’une étiquette de référence MonTexte contenant le texte texte initial
getContentPane().add(MonTexte) ;
MonTexte.setText("nouveau texte") ;
//modification du texte de l’étiquette de référence MonTexte
MonChamp1 = new JtextField(20) ;
getContentPane().add(MonChamp1) ;
}
}
2) Les menus et les barres d'outils
Une fenêtre de type JFrame est composée de composants atomiques, mais aussi de
composants qui lui sont propres comme les menus et les barres d'outils.
Import java.awt.* ;
import javax.swing.* ;
class MaFenetre extends JFrame {
private JMenuBar barreMenus ;
private JMenu couleur, dimensions ;
private JMenuItem rouge, vert, hauteur, largeur ;
public MaFenetre () {
super("Une fenetre avec un menu") ;
setSize(300, 200) ;
//création d'une barre de menu
barreMenus = new JMenuBar() ;
setJMenuBar(barreMenus) ;
//ajout de la barre de menu dans la fenêtre
//création d'un menu Couleur et de ses options Rouge et Vert
couleur = new JMenu("Couleur") ;
import java.awt.* ;
import javax.swing.* ;
class MaFenetre extends JFrame {
public MaFenetre () {
super("Une fenetre") ; setSize(300, 200) ;
Container contenu = getContentPane() ;
contenu.setLayout(new BorderLayout()) ; //inutile
contenu.add(new JButton("UN")) ;
//bouton placé au centre par défaut
contenu.add(new JButton("DEUX"), "North") ;
contenu.add(new JButton("TROIS"), "South") ;
contenu.add(new JButton("QUATRE"), "West") ;
contenu.add(new JButton("CINQ"), "East") ;
}
}
public class MonProgBLayout {
public static void main(String args[]) {
JFrame fen = new MaFenetre() ;
fen.setVisible(true) ;
}
}
Deuxième version
import java.awt.* ; import java.awt.event.* ;
import javax.swing.* ; import javax.swing.event.* ;
class MaFenetre extends JFrame implements
MouseListener {
public MaFenetre () {
super("Une fenetre qui traite les clics souris") ;
setSize(300, 200) ;
addMouseListener(this);
//la fenêtre est son propre écouteur d’événements souris
}
//L’argument e de type MouseEvent correspond à l’objet événement généré dans la
fenêtre //lors d’un clic souris. On peut utiliser les informations qui lui sont associées.
public void mouseClicked(MouseEvent e) {
int x = e.getX() ;
int y = e.getY() ;
//coordonnées du curseur de la souris au moment du clic
System.out.println("clic dans la fenetre au point de coordonnees " + x + ", " + y);
}
public void mousePressed(MouseEvent e) { }
Une boîte de confirmation offre à l'utilisateur un choix de type oui/non. Elle est construite à
l'aide de la méthode de classe showConfirmDialog de la classe JOptionPane.
Exemple
import java.awt.* ;
import javax.swing.* ;
class MaFenetre extends JFrame {
public MaFenetre () {
super("Une fenetre") ; setSize(300, 200) ; }
}
public class BoiteConf {
public static void main(String args[]) {
JFrame fen = new MaFenetre() ;
fen.setVisible(true) ;
JOptionPane.showConfirmDialog(fen, "Voulez-vous continuer ?") ;
}
}
Ce chapitre concerne les classes du package java.net qui permettent de travailler avec le
réseau au niveau applicatif. Depuis son origine, Java fournit plusieurs classes et interfaces
destinées à faciliter l'utilisation du réseau par programmation.
Le modèle OSI (Open System Interconnection) propose un découpage en sept couches des
différents composants qui permettent la communication sur un réseau.
Le protocole IP est un protocole de niveau réseau qui permet d'échanger des paquets d'octets
appelés datagrammes. La couche de transport est implémentée dans les protocoles UDP ou
TCP.
Le système des sockets est le moyen de communication inter−processus développé pour
l'Unix Berkeley (BSD). Il est actuellement implémenté sur tous les systèmes d'exploitation
utilisant TCP/IP. Un socket est le point de communication par lequel un thread peut émettre
ou recevoir des informations et ainsi elle permet la communication entre deux applications à
travers le réseau.
La communication se fait sur un port particulier de la machine. Le port est une entité logique
qui permet d'associer un service particulier à une connexion. Un port est identifié par un entier
de 1 à 65535. Par convention les 1024 premiers sont réservés pour des services standards (80 :
HTTP, 21 : FTP, 25: SMTP, ...)
Java prend en charge deux protocoles : TCP et UDP.
Les classes et interfaces utiles au développement réseau sont regroupés dans le package
java.net.
1)Définitions
URL = Uniform Resource Locator
Une URL est une adresse qui permet de localiser une ressource sur un réseau.
Elle contient :
Le protocole utilisé : http, ftp, file…
Le nom du serveur ou son adresse IP avec éventuellement un port,
Le chemin et le nom du fichier qui fournira les informations et
éventuellement des paramètres sous la forme clé=valeur.
http://www.atos-group.com/index.html
ftp://www.ibp.fr/pub/win3/outils/util.exe
file://<serveur>/<chemin>
Dans le cas d'un fichier local, l'URL est de la forme : file://<serveur>/<chemin>
Les classes Java ne supportent que les protocoles http, ftp et file.
class WebTexte {
public static void main(String args[]) {
try {
URL u = new URL(args[0]) ;
URLConnection c = u.openConnection() ;
BufferedReader in =
new BufferedReader(new InputStreamReader(c.getInputStream()));
String inLine ;
while((inLine = in.readLine()) != null) System.out.println(inLine) ;
}
catch (IOException e) {
System.out.println(e) ;
}
}
}
3)Les sockets
Présentation
Les sockets sont un ensemble de classes permettant de travailler directement au niveau
des protocoles TCP/IP ou UDP/IP. L'utilisation de ces classes est proche de celle de la
bibliothèque de fonctions C correspondantes.
Ces classes permettent de définir son propre protocole de communication applicatif pour
faire communiquer deux applications sur le réseau.
Les classes à utiliser sont :
ServerSocket : pour se mettre à l'écoute d'une nouvelle connexion (coté
serveur).
Socket : pour établir et gérer une connexion TCP (coté serveur et client).
InetAddress : pour construire une adresse réseau (coté client).
DatagramSocket : pour gérer une connexion UDP.
Nous n'aborderons dans ce cours que la programmation du protocole TCP/IP (nous ne
verrons donc pas la classe DatagramSocket)
a) Le client : classes InetAddress et Socket
La classe InetAddress permet de construire et de représenter une adresse IP.
On ne peut pas directement construire un objet de cette classe, mais celle-ci offre
plusieurs méthodes statiques qui permettent de construire et récupérer la référence d'un
objet InetAddress :
static Inetaddress getByName(String nom) ; // à partir d'un nom de serveur
static InetAddress getLocalHost() ;// Pour l'adresse de la machine locale
InetAddress a1 = InetAddress.getByName("www.inria.fr") ;
InetAddress a2 = InetAddress.getByName("194.89.34.2") ;
InetAddress a3 = InetAddress.getLocalHost() ;
La classe Socket permet de créer et gérer une connexion TCP/IP vers un serveur distant
sur un port donné. Voici quelques méthodes :
import java.io.*
import java.net.*