Exercice 1

Partage d'ensembles de coordonnées 2D

On souhaite stocker sur un serveur de données un ensemble de coordonnées 2D décrivant les positions d'un certain nombre de véhicules dans le plan.

Ce serveur devra inclure les fonctionnalités suivantes:

a) Ecrire l'application serveur.

b) Ecrire une application cliente ayant pour but de créer une nouvelle position sur un poste serveur (considérez le poste serveur initialement vide car venant d'être lancé).

c) Ecrire une application cliente ayant pour but de détruire une position sur un poste serveur.

d) Ecrire une application cliente ayant pour but de modifier une position sur un poste serveur.

Application serveur

InterfaceEx1.java

import java.rmi.* ; 

public interface InterfaceEx1 extends Remote {

  public int nombrePositions()
                throws RemoteException ;
  public boolean testPosition(String nom)
                throws RemoteException ;
  public Position position(String nom)
                throws RemoteException ;
  public void nouvellePosition(Position p,String nom)
                throws RemoteException ;
  public void destructionPosition(String nom)
                throws RemoteException ;
  public void affectePosition(Position p,String nom)
                throws RemoteException ;
  }

ServeurEx1.java

import java.rmi.* ;
import java.rmi.server.* ;
import java.net.* ;
import java.util.Hashtable ;

/* ************************************ */
/*   Extension de UnicastRemoteObject   */
/* Implantation de l'interface distante */ 
/* ************************************ */
public class ServeurEx1
       extends UnicastRemoteObject
       implements InterfaceEx1 {

  private Hashtable h ;

/* ************************************ */
/*             Constructeur             */
/* ************************************ */
  public ServeurEx1()
         throws RemoteException {
    super() ;
    h = new Hashtable() ;
  }

/* ************************************ */
/*   Fonction de l'interface distante   */
/* ************************************ */
  public int nombrePositions()
                throws RemoteException {
    return(h.size()) ;
  }
/* ************************************ */
/*   Fonction de l'interface distante   */
/* ************************************ */
  public boolean testPosition(String nom)
                throws RemoteException {
    return(h.containsKey(nom)) ;
  }
/* ************************************ */
/*   Fonction de l'interface distante   */
/* ************************************ */
  public Position position(String nom)
                throws RemoteException {
    return((Position) h.get(nom)) ;
  }
/* ************************************ */
/*   Fonction de l'interface distante   */
/* ************************************ */
  public void nouvellePosition(Position p,String nom)
                throws RemoteException {
    h.put(nom,p) ;
  }
/* ************************************ */
/*   Fonction de l'interface distante   */
/* ************************************ */
  public void destructionPosition(String nom)
                throws RemoteException {
    h.remove(nom) ;
  }
/* ************************************ */
/*   Fonction de l'interface distante   */
/* ************************************ */
  public void affectePosition(Position p,String nom)
                throws RemoteException {
  Position pp =(Position) h.get(nom) ;
  pp.x = p.x ;
  pp.y = p.y ;
  }

/* ************************************ */
/*     Application serveur assurant     */
/*   la creation d'un objet distant,    */
/*    sa referenciation avec namming    */
/*  sur la rmiregistry de l'hote local  */
/* ************************************ */
  public static void main(String [] args) {
    try {
      ServeurEx1 ib = new ServeurEx1();
      Naming.rebind("Donnee",ib) ;
      System.out.println("Prêt"); }
    catch (RemoteException re) {
      System.out.println(re) ; }
    catch(MalformedURLException e) {
      System.out.println(e) ; }
  }
}

Position.java

/* ************************************ */
/*          Classe position 2D          */
/* ************************************ */

import java.io.Serializable ;

public class Position implements Serializable {
  public float x ;
  public float y ;

  public Position(float xx,float yy) {
    x = xx ;
    y = yy ;
  }

  public String toString() {
    return(x+" "+y) ;
  }
}

Destruction d'une position.

ClientEx1v2.java

import java.rmi.* ; 

/* ************************************ */
/*       Une classe toute simple        */
/*      pour l'application cliente      */
/* ************************************ */
public class ClientEx1v2 {

  public static void main(String [] args) {
    try {
      InterfaceEx1 b =(InterfaceEx1) Naming.lookup("Donnee");
      System.out.println(b.nombrePositions()) ;
      b.nouvellePosition(new Position(5,5),"P0") ;
      System.out.println(b.nombrePositions()) ;
      b.destructionPosition("P1") ;
      System.out.println(b.nombrePositions()) ;
      b.destructionPosition("P0") ;
      System.out.println(b.nombrePositions()) ; }
    catch (Exception e) {
      System.out.println(e) ; }
  }
}

/* ************************************ */

Modification d'une position.

ClientEx1v3.java

import java.rmi.* ; 

/* ************************************ */
/*       Une classe toute simple        */
/*      pour l'application cliente      */
/* ************************************ */
public class ClientEx1v3 {

  public static void main(String [] args) {
    try {
      InterfaceEx1 b =(InterfaceEx1) Naming.lookup("Donnee");
      System.out.println(b.nombrePositions()) ;
      b.nouvellePosition(new Position(5,5),"P0") ;
      System.out.println(b.position("P0")) ;
      b.affectePosition(new Position(15,15),"P0") ;
      System.out.println(b.position("P0")) ; }
    catch (Exception e) {
      System.out.println(e) ; }
  }
}

/* ************************************ */

RETOUR