Bonjour,
Dans un TP on nous a demandé de mettre en place sur 3 machines différentes : un RMIRegistry sur une machine,
un serveur sur une deuxième machine qui s'enregistrera auprès de ce RMIRegistry ((re)bind),
un client sur la troisième machine, qui récupèrera la référence du serveur.
Hélas, un problème survient lors du bind du serveur sur le RMIRegistry :
J'ai l'erreur suivante :
Le rmiregistry sur la machine distante est lancé avec "rmiregistry 1099 &".java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.AccessException: Registry.Registry.bind disallowed; origin /172.31.18.31 is non-local host
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:385)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(AccessController.java)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.rmi.AccessException: Registry.Registry.bind disallowed; origin /172.31.18.31 is non-local host
at sun.rmi.registry.RegistryImpl.checkAccess(RegistryImpl.java:223)
at sun.rmi.registry.RegistryImpl.bind(RegistryImpl.java:119)
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:375)
...7 more
Voici le code employé côté serveur pour réaliser le bind :
Au début, j'ai pensé qu'il s'agissait d'un problème d'autorisation, aussi ai-je relancé le rmiregistry, ainsi que le serveur en fournissant les droits suivants :System.setSecurityManager(new RMISecurityManager());
Registry delegate = LocateRegistry.getRegistry("MI105-01",1099);
ImpServeurHello s=new ImpServeurHello();
delegate.bind("testdistant", s);
Mais je me retrouve avec la même erreur.grant { permission java.security.AllPermission; };
Je pense donc que je n'emploie pas la bonne méthode. J'ai trouvé une discussion sur un forum en anglais concernant plus ou moins un problème similaire. En gros, il fallait créer un Registry délégué côté serveur qui servirait d'intermedaire pour ajouter des références au Registry distant. Je n'arrive malheursement pas à retrouver cette discussion. Ni de tuto sur comment réaliser celà.
Je m'en remet donc à vous en espérant que vous ayez une solution à ce problème
NOTE : Sur les trois machines, c'est la version 1.5.0 de java qui est utilisée, mais j'ai testé avec la 1.6.0, et le problème persiste.
Partager