Bonsoir,
nous souhaitons (moi et mes collègues) développer une application répartie en java, et, afin de faciliter les communications réseaux, nous nous sommes penché sur RMI. Ce système offre tout ce dont nous avons besoin ; nous avons donc implémenter un petit exemple que voici :
Product.java
ProductClient.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 import java.rmi.*; public interface Product extends Remote { String getDescription() throws RemoteException; }
ProductImpl.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 import java.rmi.*; import java.rmi.server.*; import javax.naming.*; /** This program demonstrates how to call a remote method on two objects that are located through the naming service. */ public class ProductClient { public static void main(String[] args) { System.setProperty("java.security.policy", "client.policy"); System.setSecurityManager(new RMISecurityManager()); String url = "rmi://"+args[0]+"/"; // change to "rmi://yourserver.com/" when server runs on remote machine yourserver.com try { Context namingContext = new InitialContext(); Product c1 = (Product) namingContext.lookup(url + "grille-pain"); Product c2 = (Product) namingContext.lookup(url + "micro-ondes"); System.out.println(c1.getDescription()); System.out.println(c2.getDescription()); } catch (Exception e) { e.printStackTrace(); } } }
ProductServer.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 import java.rmi.*; import java.rmi.server.*; public class ProductImpl extends UnicastRemoteObject implements Product { private String name; public ProductImpl(String n) throws RemoteException { name = n; } public String getDescription() throws RemoteException { return ("Je suis un " + name + ". Achetez moi!"); } }
Tout ce code fonctionne très bien, en localhost (client et serveur sur la même machine), sur des machines distantes sous Windows, avec un Serveur sous Windows, et des clients sous Linux, mais on a un gros problème dès que le serveur est sous Linux :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 import java.rmi.*; import java.rmi.registry.*; import java.rmi.server.*; import javax.naming.*; public class ProductServer { public static void main(String args[]){ try { System.out.println("Construction des implementations du serveur ..."); ProductImpl p1 = new ProductImpl("grille-pain Moulinex"); ProductImpl p2 = new ProductImpl("micro-ondes Philips"); System.out.println("Liaison des implementations du serveur a la base de registres..."); /* Context namingContext = new InitialContext(); namingContext.bind("rmi:grille-pain", p1); namingContext.bind("rmi:micro-ondes", p2); */ Registry registry=null; int port = 1099; registry = LocateRegistry.createRegistry(port); registry.rebind( "grille-pain", p1 ); registry.rebind( "micro-ondes", p2 ); System.out.println("Attente des invocations des clients..."); } catch(Exception e){ e.printStackTrace(); } } }
Voici l'erreur
Nous avons cherché, et les seules explications que nous avons trouvés parlent d'un problème de configuration de /etc/hosts , mais dans la mesure où nous n'adressons les serveurs que par leur IP, le problème ne semble pas venir de là.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is: java.net.ConnectException: Connection refused at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:574) at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185) at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:94) at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHa ndler.java:179) at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:1 32) at $Proxy0.getDescription(Unknown Source) at ProductClient.main(ProductClient.java:28) Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:507) at java.net.Socket.connect(Socket.java:457) at java.net.Socket.<init>(Socket.java:365) at java.net.Socket.<init>(Socket.java:178) at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:2 2) at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:1 28) at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:569) ... 7 more
Nous avons également testé (à tout hasard) en réseau statique (pas de DHCP ), avec rigoureusement le même résultat. Nous en appelons donc à vos compétences, d'autant que ce projet est à remettre à la fin de la semaine (Circonstance atténuante : nous n'avons que deux semaines pour réaliser ce projet, un CVS réparti).
Merci !
Partager