2009-12-01 11 views
11

J'ai un problème en utilisant java rmi:connexion Rmi refusé avec localhost

Quand je suis en train d'exécuter mon serveur, je reçois un connectException (voir ci-dessous).

Exception se produit lors de l'exécution de la méthode de retirage:

Runtime.getRuntime().exec("rmiregistry 2020"); 
MyServer server = new MyServer(); 
Naming.rebind("//localhost:2020/RemoteDataPointHandler", server); 

lors de l'utilisation rmi: // localhost: 2020/RemoteDataPointHandler à la place, il ne fonctionne pas non plus. L'utilisation du port par défaut ne fonctionne pas non plus. J'ai également essayé d'utiliser l'adresse IP 127.0.0.1, mais avec le même effet.

mon exécution args:

-Djava.security.policy=java.security.AllPermission 
 
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: localhost; 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.newCall(UnicastRef.java:306) 
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) 
    at java.rmi.Naming.rebind(Naming.java:160) 
    at be.fortega.knx.server.Main.(Main.java:25) 
    at be.fortega.knx.server.Main.main(Main.java:16) 
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:433) 
    at java.net.Socket.connect(Socket.java:524) 
    at java.net.Socket.connect(Socket.java:474) 
    at java.net.Socket.(Socket.java:371) 
    at java.net.Socket.(Socket.java:184) 
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22) 
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128) 
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:569) 
    ... 7 more 

+1

Je dirais que vous avez un problème de synchronisation ici. Le Registre n'a pas complètement démarré lorsque vous effectuez la reliure. – EJP

Répondre

5

Il semble fonctionner quand je remplace le

Runtime.getRuntime().exec("rmiregistry 2020"); 

par

LocateRegistry.createRegistry(2020); 

quelqu'un une idée pourquoi? Quelle est la différence?

+4

Le deuxième démarre en tant qu'objet distant dans la JVM en cours. Commence d'abord un processus séparé. – EJP

5

Vous devez avoir un rmiregistry en cours d'exécution avant d'essayer de vous connecter (enregistrer) un service RMI avec celui-ci.

L'appel de méthode LocateRegistry.createRegistry(2020) crée et exporte un registre sur le numéro de port spécifié.

Consultez la documentation de LocateRegistry

+0

Il le fait, voir son code. – EJP

11

avait un problème simliar à cette exception près de la connexion. il est lancé soit lorsque le registre n'a pas encore commencé (comme dans votre cas) ou lorsque le registre est déjà inexploité (comme dans mon cas).

mais un bref commentaire à la différence entre les 2 façons de commencer le Registre:

Runtime.getRuntime().exec("rmiregistry 2020"); 

court le rmiregistry.exe dans Javas-bin dans un nouveau processus et continue en parallèle avec votre code java. L'appel de la méthode rmi démarre le registre, renvoie la référence à cet objet distant de registre, puis continue avec l'instruction suivante.

dans votre cas, le registre n'est pas démarré dans le temps lorsque vous essayez de lier votre objet

+0

Merci pour l'explication! – Fortega

1

Une différence que nous pouvons noter dans Windows est:

Si vous utilisez Runtime.getRuntime().exec("rmiregistry 1024");

vous pouvez voir rmiregistry processus .exe fonctionnera dans votre gestionnaire de tâches

alors que si vous utilisez Registry registry = LocateRegistry.createRegistry(1024);

vous ne pouvez pas voir le processus en cours d'exécution dans le Gestionnaire des tâches,

Je pense que Java le gère d'une manière différente.

et ceci est mon fichier server.policy

Avant d'exécuter l'application, assurez-vous que vous avez tué tous vos javaw.exe et rmiregistry.exe correspond à vos programmes existants rmi qui sont déjà en cours d'exécution .

Le code suivant fonctionne pour moi en utilisant Registry.LocateRegistry() ou

Runtime.getRuntime.exec(""); 


// Standard extensions get all permissions by default 

grant { 
    permission java.security.AllPermission; 
}; 

l'argument VM

-Djava.rmi.server.codebase=file:\C:\Users\Durai\workspace\RMI2\src\ 

code:

package server;  

import java.rmi.Naming; 
import java.rmi.RMISecurityManager; 
import java.rmi.Remote; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 

public class HelloServer 
{ 
    public static void main (String[] argv) 
    { 
    try { 

     if(System.getSecurityManager()==null){ 
      System.setProperty("java.security.policy","C:\\Users\\Durai\\workspace\\RMI\\src\\server\\server.policy"); 
      System.setSecurityManager(new RMISecurityManager()); 
     } 

Runtime.getRuntime().exec("rmiregistry 1024"); 

//  Registry registry = LocateRegistry.createRegistry(1024); 
    // registry.rebind ("Hello", new Hello ("Hello,From Roseindia.net pvt ltd!")); 
    //Process process = Runtime.getRuntime().exec("C:\\Users\\Durai\\workspace\\RMI\\src\\server\\rmi_registry_start.bat"); 

     Naming.rebind ("//localhost:1024/Hello",new Hello ("Hello,From Roseindia.net pvt ltd!")); 
     System.out.println ("Server is connected and ready for operation."); 
    } 
    catch (Exception e) { 
     System.out.println ("Server not connected: " + e); 
     e.printStackTrace(); 
    } 
    } 
} 
0

il semble que vous devez régler votre commande en tant String[] par exemple:

String[] command = new String[]{"rmiregistry","2020"}; 
Runtime.getRuntime().exec(command); 

juste comme le style de main(String[] args).