diff --git a/TP2/.gitignore b/TP2/.gitignore new file mode 100644 index 0000000..6b468b6 --- /dev/null +++ b/TP2/.gitignore @@ -0,0 +1 @@ +*.class diff --git a/TP2/.vscode/settings.json b/TP2/.vscode/settings.json new file mode 100644 index 0000000..b1bba8a --- /dev/null +++ b/TP2/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "files.exclude": { + "**/.git": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true, + "**/Thumbs.db": true, + "**/*.class": true + } +} \ No newline at end of file diff --git a/TP2/Carnet.java b/TP2/Carnet.java new file mode 100644 index 0000000..cd540f9 --- /dev/null +++ b/TP2/Carnet.java @@ -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; +} diff --git a/TP2/CarnetImpl.java b/TP2/CarnetImpl.java new file mode 100644 index 0000000..d79265b --- /dev/null +++ b/TP2/CarnetImpl.java @@ -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 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(); + 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; + } +} \ No newline at end of file diff --git a/TP2/RFiche.java b/TP2/RFiche.java new file mode 100644 index 0000000..bf3d7ee --- /dev/null +++ b/TP2/RFiche.java @@ -0,0 +1,7 @@ +import java.rmi.*; + +public interface RFiche extends Remote { + public String getNom() throws RemoteException; + + public String getEmail() throws RemoteException; +} diff --git a/TP2/RFicheImpl.java b/TP2/RFicheImpl.java new file mode 100644 index 0000000..499ba86 --- /dev/null +++ b/TP2/RFicheImpl.java @@ -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 + ">"; + } +} \ No newline at end of file diff --git a/TP2/SFiche.java b/TP2/SFiche.java new file mode 100644 index 0000000..c379ee7 --- /dev/null +++ b/TP2/SFiche.java @@ -0,0 +1,8 @@ +import java.io.*; + +public interface SFiche extends Serializable { + + public String getNom(); + + public String getEmail(); +} diff --git a/TP2/SFicheImpl.java b/TP2/SFicheImpl.java new file mode 100644 index 0000000..dcb9a5f --- /dev/null +++ b/TP2/SFicheImpl.java @@ -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 + ">"; + } + +} \ No newline at end of file diff --git a/TP2/Saisie.java b/TP2/Saisie.java new file mode 100644 index 0000000..9bcc2d8 --- /dev/null +++ b/TP2/Saisie.java @@ -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); + } + +} diff --git a/TP2/java.policy b/TP2/java.policy new file mode 100644 index 0000000..ebb4994 --- /dev/null +++ b/TP2/java.policy @@ -0,0 +1,3 @@ +grant { + permission java.security.AllPermission; +}; \ No newline at end of file diff --git a/TP2/page.html b/TP2/page.html new file mode 100644 index 0000000..aa37f96 --- /dev/null +++ b/TP2/page.html @@ -0,0 +1,13 @@ + + +L'applet Saisie + + + + + + + + + + diff --git a/TP2/tp-rmi.html b/TP2/tp-rmi.html new file mode 100644 index 0000000..d7b565c --- /dev/null +++ b/TP2/tp-rmi.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + +
+

TP RMI

+

Daniel +Hagimont

+

Daniel.Hagimont@enseeiht.fr

+


+
+

+

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.
+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.
+

+

fig
+

+


+Si on ne trouve pas la personne dans le serveur indiqué, la recherche +est alors propagée au second serveur.
+

+


+L'interface d'un serveur est la suivante :
+

+

public interface Carnet extends Remote {
+    public void Ajouter(SFiche sf) throws +RemoteException;
+    public RFiche Consulter(String n, boolean forward) +throws RemoteException;
+}
+

+

public interface SFiche extends +Serializable {
+    public String getNom ();
+    public String getEmail ();
+}
+public interface RFiche extends Remote {
+    public String getNom () throws RemoteException;
+    public String getEmail () throws RemoteException;
+}

+


+L'enregistrement d'une personne utilise la sérialisation pour envoyer +au serveur une copie d'un objet d'interface SFiche.
+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.
+La méthode de consultation inclut un paramètre booléen forward indiquant si la requête +doit être propogée à l'autre serveur (pour éviter de boucler).
+

+

On vous donne :
+- Carnet.java : l'interface d'un serveur
+- SFiche.java : l'interface de l'objet +sérialisé pour l'enregistrement auprès d'un serveur
+- RFiche.java : l'interface de l'objet +RMI retourné lors de la consultation auprès d'un serveur
+- Saisie.java et page.html : l'applet implantant l'interface graphique +de l'application
+    Pour lancer l'applet :
+        - en standalone : java Saisie
+        - avec l'appletviewer : +appletviewer -J-Djava.security.policy=java.policy
+        - depuis un navigateur, plus +compliqué, il faut signer l'applet ...
+

+

Vous devez :
+- implanter CarnetImpl.java : la classe d'un serveur
+- implanter SFicheImpl.java : la classe de l'objet sérialisé
+- implanter RFicheImpl.java : la classe de l'objet RMI retourné par le +serveur
+- compléter Saisie.java : pour faire les appels aux serveurs
+

+ +