ajout TP2

This commit is contained in:
Laureηt 2023-04-22 17:36:05 +02:00
parent 35f382698c
commit d78421a24a
Signed by: Laurent
SSH key fingerprint: SHA256:kZEpW8cMJ54PDeCvOhzreNr4FSh6R13CMGH/POoO8DI
12 changed files with 430 additions and 0 deletions

1
TP2/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
*.class

11
TP2/.vscode/settings.json vendored Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View file

@ -0,0 +1,3 @@
grant {
permission java.security.AllPermission;
};

13
TP2/page.html Normal file
View 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
View 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>
&nbsp;&nbsp;&nbsp; public void Ajouter(SFiche sf) throws
RemoteException;<br>
&nbsp;&nbsp;&nbsp; public RFiche Consulter(String n, boolean forward)
throws RemoteException;<br>
}<br>
</p>
<p style="margin-left: 1.27cm;">public interface SFiche extends
Serializable {<br>
&nbsp;&nbsp;&nbsp; public String getNom ();<br>
&nbsp;&nbsp;&nbsp; public String getEmail ();<br>
}<br>
public interface RFiche extends Remote {<br>
&nbsp;&nbsp;&nbsp; public String getNom () throws RemoteException;<br>
&nbsp;&nbsp;&nbsp; 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>
&nbsp;&nbsp;&nbsp; Pour lancer l'applet :<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; - en standalone : java Saisie<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; - avec l'appletviewer :
appletviewer -J-Djava.security.policy=java.policy<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; - 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>