ajout TP2
This commit is contained in:
parent
35f382698c
commit
d78421a24a
1
TP2/.gitignore
vendored
Normal file
1
TP2/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
*.class
|
11
TP2/.vscode/settings.json
vendored
Normal file
11
TP2/.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"files.exclude": {
|
||||||
|
"**/.git": true,
|
||||||
|
"**/.svn": true,
|
||||||
|
"**/.hg": true,
|
||||||
|
"**/CVS": true,
|
||||||
|
"**/.DS_Store": true,
|
||||||
|
"**/Thumbs.db": true,
|
||||||
|
"**/*.class": true
|
||||||
|
}
|
||||||
|
}
|
8
TP2/Carnet.java
Normal file
8
TP2/Carnet.java
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
import java.rmi.*;
|
||||||
|
|
||||||
|
public interface Carnet extends Remote {
|
||||||
|
|
||||||
|
public void Ajouter(SFiche sf) throws RemoteException;
|
||||||
|
|
||||||
|
public RFiche Consulter(String n, boolean forward) throws RemoteException;
|
||||||
|
}
|
62
TP2/CarnetImpl.java
Normal file
62
TP2/CarnetImpl.java
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
import java.rmi.*;
|
||||||
|
import java.rmi.server.UnicastRemoteObject;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class CarnetImpl extends UnicastRemoteObject implements Carnet {
|
||||||
|
|
||||||
|
private Set<SFiche> fiches;
|
||||||
|
private int id;
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try {
|
||||||
|
CarnetImpl carnet = new CarnetImpl(Integer.parseInt(args[0]));
|
||||||
|
Naming.bind("rmi://localhost:4000/Carnet" + args[0], carnet);
|
||||||
|
System.out.println("Le Carnet" + args[0] + " a été publié sur le registre !");
|
||||||
|
System.out.println();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public CarnetImpl(int id) throws RemoteException {
|
||||||
|
this.fiches = new HashSet<SFiche>();
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Ajouter(SFiche sf) throws RemoteException {
|
||||||
|
fiches.add(sf);
|
||||||
|
System.out.println("La fiche [" + sf + "] a été ajoutée.");
|
||||||
|
System.out.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
public RFiche Consulter(String nom, boolean forward) throws RemoteException {
|
||||||
|
for (SFiche sf : fiches) {
|
||||||
|
if (nom.equals(sf.getNom())) {
|
||||||
|
System.out.println("La fiche [" + sf + "] a été consultée." + (!forward ? " (forward)" : ""));
|
||||||
|
System.out.println();
|
||||||
|
return new RFicheImpl(sf.getNom(), sf.getEmail());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (forward) {
|
||||||
|
try {
|
||||||
|
System.out.println("Demande transmise au Carnet" + (id % 2 + 1));
|
||||||
|
Carnet carnet = (Carnet) Naming.lookup("//localhost:4000/Carnet" + (id % 2 + 1));
|
||||||
|
RFiche fiche = carnet.Consulter(nom, false);
|
||||||
|
System.out.println("Fiche [" + fiche.getNom() + " <" + fiche.getEmail() + ">] trouvée sur le Carnet"
|
||||||
|
+ (id % 2 + 1));
|
||||||
|
System.out.println();
|
||||||
|
return fiche;
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
System.out.println("Fiche non trouvée sur le Carnet" + (id % 2 + 1));
|
||||||
|
System.out.println();
|
||||||
|
return null;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
System.out.println("Fiche non trouvée (Carnet" + id + ")");
|
||||||
|
System.out.println();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
7
TP2/RFiche.java
Normal file
7
TP2/RFiche.java
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
import java.rmi.*;
|
||||||
|
|
||||||
|
public interface RFiche extends Remote {
|
||||||
|
public String getNom() throws RemoteException;
|
||||||
|
|
||||||
|
public String getEmail() throws RemoteException;
|
||||||
|
}
|
29
TP2/RFicheImpl.java
Normal file
29
TP2/RFicheImpl.java
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
import java.rmi.*;
|
||||||
|
import java.rmi.server.UnicastRemoteObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fiche que l'on reçoit du serveur
|
||||||
|
*/
|
||||||
|
public class RFicheImpl extends UnicastRemoteObject implements RFiche {
|
||||||
|
|
||||||
|
private String nom;
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
public RFicheImpl(String nom, String email) throws RemoteException {
|
||||||
|
this.nom = nom;
|
||||||
|
this.email = email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNom() throws RemoteException {
|
||||||
|
return this.nom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmail() throws RemoteException {
|
||||||
|
return this.email;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return this.nom + " <" + this.email + ">";
|
||||||
|
}
|
||||||
|
}
|
8
TP2/SFiche.java
Normal file
8
TP2/SFiche.java
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
import java.io.*;
|
||||||
|
|
||||||
|
public interface SFiche extends Serializable {
|
||||||
|
|
||||||
|
public String getNom();
|
||||||
|
|
||||||
|
public String getEmail();
|
||||||
|
}
|
29
TP2/SFicheImpl.java
Normal file
29
TP2/SFicheImpl.java
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
/**
|
||||||
|
* Fiche (sérialisable) que l'on envoie au serveur
|
||||||
|
*/
|
||||||
|
public class SFicheImpl implements SFiche {
|
||||||
|
|
||||||
|
private String nom;
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
public SFicheImpl(String nom, String email) {
|
||||||
|
this.nom = nom;
|
||||||
|
this.email = email;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getNom() {
|
||||||
|
return this.nom;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getEmail() {
|
||||||
|
return this.email;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return this.nom + " <" + this.email + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
98
TP2/Saisie.java
Normal file
98
TP2/Saisie.java
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
|
||||||
|
/* -------------------------------------------------------
|
||||||
|
Les packages Java qui doivent etre importes.
|
||||||
|
*/
|
||||||
|
import java.lang.*;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.event.*;
|
||||||
|
import java.applet.*;
|
||||||
|
import java.rmi.*;
|
||||||
|
import javax.swing.*;
|
||||||
|
|
||||||
|
/* -------------------------------------------------------
|
||||||
|
Implementation de l'application
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class Saisie extends JApplet {
|
||||||
|
private static final long serialVersionUID = 1;
|
||||||
|
TextField nom, email;
|
||||||
|
Choice carnets;
|
||||||
|
Label message;
|
||||||
|
|
||||||
|
public void init() {
|
||||||
|
setSize(300, 200);
|
||||||
|
setLayout(new GridLayout(6, 2));
|
||||||
|
add(new Label(" Nom : "));
|
||||||
|
nom = new TextField(30);
|
||||||
|
add(nom);
|
||||||
|
add(new Label(" Email : "));
|
||||||
|
email = new TextField(30);
|
||||||
|
add(email);
|
||||||
|
add(new Label(" Carnet : "));
|
||||||
|
carnets = new Choice();
|
||||||
|
carnets.addItem("Carnet1");
|
||||||
|
carnets.addItem("Carnet2");
|
||||||
|
add(carnets);
|
||||||
|
add(new Label(""));
|
||||||
|
add(new Label(""));
|
||||||
|
Button Abutton = new Button("Ajouter");
|
||||||
|
Abutton.addActionListener(new AButtonAction());
|
||||||
|
add(Abutton);
|
||||||
|
Button Cbutton = new Button("Consulter");
|
||||||
|
Cbutton.addActionListener(new CButtonAction());
|
||||||
|
add(Cbutton);
|
||||||
|
message = new Label();
|
||||||
|
add(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// La reaction au bouton Consulter
|
||||||
|
class CButtonAction implements ActionListener {
|
||||||
|
public void actionPerformed(ActionEvent ae) {
|
||||||
|
String n, c;
|
||||||
|
n = nom.getText();
|
||||||
|
c = carnets.getSelectedItem();
|
||||||
|
message.setText("Consulter(" + n + "," + c + ") ");
|
||||||
|
try {
|
||||||
|
Carnet carnet = (Carnet) Naming.lookup("//localhost:4000/" + c);
|
||||||
|
RFiche fiche = carnet.Consulter(n, true);
|
||||||
|
System.out.println(fiche.getNom() + " <" + fiche.getEmail() + "> reçue");
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
System.out.println("fiche non trouvée");
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
System.out.println();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// La reaction au bouton Ajouter
|
||||||
|
class AButtonAction implements ActionListener {
|
||||||
|
public void actionPerformed(ActionEvent ae) {
|
||||||
|
String n, e, c;
|
||||||
|
n = nom.getText();
|
||||||
|
e = email.getText();
|
||||||
|
c = carnets.getSelectedItem();
|
||||||
|
message.setText("Ajouter(" + n + "," + e + "," + c + ") ");
|
||||||
|
try {
|
||||||
|
Carnet carnet = (Carnet) Naming.lookup("//localhost:4000/" + c);
|
||||||
|
SFiche fiche = new SFicheImpl(n, e);
|
||||||
|
carnet.Ajouter(fiche);
|
||||||
|
System.out.println(fiche + " envoyée");
|
||||||
|
} catch (Exception except) {
|
||||||
|
except.printStackTrace();
|
||||||
|
}
|
||||||
|
System.out.println();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String args[]) {
|
||||||
|
Saisie a = new Saisie();
|
||||||
|
a.init();
|
||||||
|
a.start();
|
||||||
|
JFrame frame = new JFrame("Applet");
|
||||||
|
frame.setSize(400, 200);
|
||||||
|
frame.getContentPane().add(a);
|
||||||
|
frame.setVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
3
TP2/java.policy
Normal file
3
TP2/java.policy
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
grant {
|
||||||
|
permission java.security.AllPermission;
|
||||||
|
};
|
13
TP2/page.html
Normal file
13
TP2/page.html
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>L'applet Saisie </title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<applet code=Saisie.class width=460 height=160>
|
||||||
|
</applet>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
161
TP2/tp-rmi.html
Normal file
161
TP2/tp-rmi.html
Normal file
|
@ -0,0 +1,161 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="CONTENT-TYPE"
|
||||||
|
content="text/html; charset=windows-1252">
|
||||||
|
<title></title>
|
||||||
|
<meta name="GENERATOR" content="OpenOffice.org 1.1.4 (Win32)">
|
||||||
|
<meta name="CREATED" content="20051027;135681">
|
||||||
|
<meta name="CHANGEDBY" content="Daniel Hagimont">
|
||||||
|
<meta name="CHANGED" content="20051106;19023960">
|
||||||
|
<meta name="ProgId" content="FrontPage.Editor.Document">
|
||||||
|
<meta name="Originator" content="Microsoft Word 10">
|
||||||
|
<meta name="Template"
|
||||||
|
content="C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\html.dot">
|
||||||
|
<!--[if !mso]>
|
||||||
|
<style>
|
||||||
|
v\:* {behavior:url(#default#VML);}
|
||||||
|
o\:* {behavior:url(#default#VML);}
|
||||||
|
w\:* {behavior:url(#default#VML);}
|
||||||
|
.shape {behavior:url(#default#VML);}
|
||||||
|
</style>
|
||||||
|
<![endif]--><!--[if gte mso 9]><xml>
|
||||||
|
<w:WordDocument>
|
||||||
|
<w:Zoom>95</w:Zoom>
|
||||||
|
<w:GrammarState>Clean</w:GrammarState>
|
||||||
|
<w:HyphenationZone>21</w:HyphenationZone>
|
||||||
|
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
|
||||||
|
</w:WordDocument>
|
||||||
|
</xml><![endif]--><!--[if gte mso 10]>
|
||||||
|
<style>
|
||||||
|
/* Style Definitions */
|
||||||
|
table.MsoNormalTable
|
||||||
|
{mso-style-name:"Tableau Normal";
|
||||||
|
mso-tstyle-rowband-size:0;
|
||||||
|
mso-tstyle-colband-size:0;
|
||||||
|
mso-style-noshow:yes;
|
||||||
|
mso-style-parent:"";
|
||||||
|
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
|
||||||
|
mso-para-margin:0cm;
|
||||||
|
mso-para-margin-bottom:.0001pt;
|
||||||
|
mso-pagination:widow-orphan;
|
||||||
|
font-size:10.0pt;
|
||||||
|
font-family:"Times New Roman"}
|
||||||
|
</style>
|
||||||
|
<![endif]--><!--[if gte mso 9]><xml>
|
||||||
|
<o:shapelayout v:ext="edit">
|
||||||
|
<o:idmap v:ext="edit" data="1"/>
|
||||||
|
</o:shapelayout></xml><![endif]--><!--[if gte mso 9]>
|
||||||
|
<xml><o:shapedefaults v:ext="edit" spidmax="1027"/>
|
||||||
|
</xml><![endif]--><!--[if gte vml 1]><v:shapetype id="_x0000_t75"
|
||||||
|
coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"
|
||||||
|
filled="f" stroked="f">
|
||||||
|
<v:stroke joinstyle="miter"/>
|
||||||
|
<v:formulas>
|
||||||
|
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
|
||||||
|
<v:f eqn="sum @0 1 0"/>
|
||||||
|
<v:f eqn="sum 0 0 @1"/>
|
||||||
|
<v:f eqn="prod @2 1 2"/>
|
||||||
|
<v:f eqn="prod @3 21600 pixelWidth"/>
|
||||||
|
<v:f eqn="prod @3 21600 pixelHeight"/>
|
||||||
|
<v:f eqn="sum @0 0 1"/>
|
||||||
|
<v:f eqn="prod @6 1 2"/>
|
||||||
|
<v:f eqn="prod @7 21600 pixelWidth"/>
|
||||||
|
<v:f eqn="sum @8 21600 0"/>
|
||||||
|
<v:f eqn="prod @7 21600 pixelHeight"/>
|
||||||
|
<v:f eqn="sum @10 21600 0"/>
|
||||||
|
</v:formulas>
|
||||||
|
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
|
||||||
|
<o:lock v:ext="edit" aspectratio="t"/>
|
||||||
|
</v:shapetype><v:shape id="_x0000_s1025" type="#_x0000_t75" style='width:172.5pt;
|
||||||
|
height:114pt'>
|
||||||
|
<v:imagedata src="TP1_fichiers/image001.gif" o:title="logo_inpg"/>
|
||||||
|
</v:shape><![endif]-->
|
||||||
|
<style>
|
||||||
|
<!--
|
||||||
|
P { color: #000000 }
|
||||||
|
A:link { color: #0000ff }
|
||||||
|
A:visited { color: #800080 }
|
||||||
|
-->
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body dir="ltr" lang="fr-FR" link="#0000ff" text="#000000"
|
||||||
|
vlink="#800080">
|
||||||
|
<br>
|
||||||
|
<p align="center"><font style="font-size: 20pt;" size="5"><b>TP RMI</b></font></p>
|
||||||
|
<p style="margin-bottom: 0cm;" align="center"><font size="3">Daniel
|
||||||
|
Hagimont</font></p>
|
||||||
|
<p style="margin-bottom: 0cm;" align="center"><font size="3">Daniel.Hagimont@enseeiht.fr</font></p>
|
||||||
|
<p align="center"><br>
|
||||||
|
<br>
|
||||||
|
</p>
|
||||||
|
<p style="margin-left: 1.27cm;">L'objectif de ce TP est d'utiliser Java
|
||||||
|
RMI pour implanter une petite application dans laquelle une applet
|
||||||
|
permet de saisir les coordonnées d'une personne (nom, adresse email) et
|
||||||
|
de les enregistrer dans un serveur. L'interface permet de sélectionner
|
||||||
|
le serveur dans lequel la personne doit être enregistrée. On gèrera 2
|
||||||
|
serveurs.<br>
|
||||||
|
L'application permet également de rechercher l'email d'une personne qui
|
||||||
|
a été enregistrée en indiquant le serveur dans lequel faire cette
|
||||||
|
recherche.<br>
|
||||||
|
</p>
|
||||||
|
<p style="margin-left: 1.27cm; text-align: center;"><img
|
||||||
|
style="width: 329px; height: 162px;" alt="fig" src="fig.jpg"><br>
|
||||||
|
</p>
|
||||||
|
<p style="margin-left: 1.27cm;"><br>
|
||||||
|
Si on ne trouve pas la personne dans le serveur indiqué, la recherche
|
||||||
|
est alors propagée au second serveur.<br>
|
||||||
|
</p>
|
||||||
|
<p style="margin-left: 1.27cm;"><br>
|
||||||
|
L'interface d'un serveur est la suivante :<br>
|
||||||
|
</p>
|
||||||
|
<p style="margin-left: 1.27cm;">public interface Carnet extends Remote {<br>
|
||||||
|
public void Ajouter(SFiche sf) throws
|
||||||
|
RemoteException;<br>
|
||||||
|
public RFiche Consulter(String n, boolean forward)
|
||||||
|
throws RemoteException;<br>
|
||||||
|
}<br>
|
||||||
|
</p>
|
||||||
|
<p style="margin-left: 1.27cm;">public interface SFiche extends
|
||||||
|
Serializable {<br>
|
||||||
|
public String getNom ();<br>
|
||||||
|
public String getEmail ();<br>
|
||||||
|
}<br>
|
||||||
|
public interface RFiche extends Remote {<br>
|
||||||
|
public String getNom () throws RemoteException;<br>
|
||||||
|
public String getEmail () throws RemoteException;<br>
|
||||||
|
}</p>
|
||||||
|
<p style="margin-left: 1.27cm;"><br>
|
||||||
|
L'enregistrement d'une personne utilise la sérialisation pour envoyer
|
||||||
|
au serveur une copie d'un objet d'interface SFiche.<br>
|
||||||
|
La consultation retourne une référence à un objet RMI d'interface
|
||||||
|
RFiche ; l'applet qui consulte peut alors récupérer l'adresse email par
|
||||||
|
un appel à distance sur cette référence.<br>
|
||||||
|
La méthode de consultation inclut un paramètre booléen <span
|
||||||
|
style="font-style: italic;">forward </span>indiquant si la requête
|
||||||
|
doit être propogée à l'autre serveur (pour éviter de boucler).<br>
|
||||||
|
</p>
|
||||||
|
<p style="margin-left: 1.27cm;">On vous donne :<br>
|
||||||
|
- Carnet.java : l'interface d'un serveur<br>
|
||||||
|
- SFiche.java : l'interface de l'objet
|
||||||
|
sérialisé pour l'enregistrement auprès d'un serveur<br>
|
||||||
|
- RFiche.java : l'interface de l'objet
|
||||||
|
RMI retourné lors de la consultation auprès d'un serveur<br>
|
||||||
|
- Saisie.java et page.html : l'applet implantant l'interface graphique
|
||||||
|
de l'application<br>
|
||||||
|
Pour lancer l'applet :<br>
|
||||||
|
- en standalone : java Saisie<br>
|
||||||
|
- avec l'appletviewer :
|
||||||
|
appletviewer -J-Djava.security.policy=java.policy<br>
|
||||||
|
- depuis un navigateur, plus
|
||||||
|
compliqué, il faut signer l'applet ...<br>
|
||||||
|
</p>
|
||||||
|
<p style="margin-left: 1.27cm;">Vous devez :<br>
|
||||||
|
- implanter CarnetImpl.java : la classe d'un serveur<br>
|
||||||
|
- implanter SFicheImpl.java : la classe de l'objet sérialisé<br>
|
||||||
|
- implanter RFicheImpl.java : la classe de l'objet RMI retourné par le
|
||||||
|
serveur<br>
|
||||||
|
- compléter Saisie.java : pour faire les appels aux serveurs<br>
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in a new issue