import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.server.UnicastRemoteObject; import java.util.Random; public class NumberGenImpl extends UnicastRemoteObject implements NumberGen, Runnable { // La référence distante du client pour que le serveur puisse le recontacter // à la fin de traitement afin de lui transmettre le résultat. private NumberAsk myRemoteInterface; public NumberGenImpl() throws RemoteException { } public void run() { System.out.println("Un client demande un numéro"); try { // Ici il s’agit d’une tâche de démonstration sans portée pratique, // mais le fait de mettre un temps d'attente va probablement mettre // en lumière le résultat. Thread.sleep(3000); // géneration d'un entier. Random rand = new Random(); // invocation de la méthode distante du client pour lui transemettre // le numéro. myRemoteInterface.takeNumber(rand.nextInt()); } catch (Exception e) { } } // La définition de la méthode distante qui permet au client de demande un // numéro. public void needNumber(NumberAsk ci) throws RemoteException { myRemoteInterface = ci; //Création et démarrage d'un sous-processus (Thread) pour démarrer le traitement du callback. Thread i = new Thread(this, "ServerImpl"); i.start(); } public static void main(String[] args) { try { // Instancier un annuaire (Registry) sur la machine locale et sur le // port 1099. LocateRegistry.createRegistry(1099); NumberGenImpl si = new NumberGenImpl(); // Enregistrement de l'objet distant dans l'annuaire RMI Naming.rebind("rmi://localhost/ServerImpl", si); System.out.println("Serveur en ligne."); } catch (Exception e) { e.printStackTrace(); } } }