Erreur de connexion : java RMI & linux
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
Code:
1 2 3 4 5 6
|
import java.rmi.*;
public interface Product extends Remote {
String getDescription() throws RemoteException;
} |
ProductClient.java
Code:
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();
}
}
} |
ProductImpl.java
Code:
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!");
}
} |
ProductServer.java
Code:
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();
}
}
} |
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 :
Voici l'erreur
Code:
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 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à.
Nous avons également testé (à tout hasard) en réseau statique (pas de DHCP :aie:), 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 :oops: (Circonstance atténuante : nous n'avons que deux semaines pour réaliser ce projet, un CVS réparti).
Merci !