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