web-dev-qa-db-fra.com

Connexion Rmi refusée avec localhost

J'ai un problème avec Java rmi:

Lorsque j'essaie de faire fonctionner mon serveur, je reçois une exception connectException (voir ci-dessous).

Une exception se produit lors de l'exécution de la méthode de reliure:

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

si vous utilisez plutôt rmi: // localhost: 2020/RemoteDataPointHandler, cela ne fonctionne pas non plus. Également utiliser le port par défaut ne fonctionne pas. J'ai aussi essayé d'utiliser l'adresse IP 127.0.0.1, mais avec le même effet.

mon runtime args:

-Djava.security.policy=Java.security.AllPermission
 Exception dans le thread "principal" Java.rmi.ConnectException: connexion refusée à l'hôte: localhost; exception imbriquée est la suivante: 
 Java.net.ConnectException: connexion refusée 
 à Sun.rmi.transport.tcp.TCPEndpoint.newSocket (TCPEndpoint.Java:574) 
 à l'adresse Sun.rmi.transport.tcp.TCPChannel.createConnection (TCPChannel.Java:185) 
 à Sun.rmi.transport.tcp.TCPChannel.newConnection (TCPChannel.Java:171) 
 sur Sun.rmi.server.UnicastRef.newCall (UnicastRef.Java:306) 
 at Sun.rmi.registry.RegistryImpl_Stub.rebind (Source inconnue) 
 sur Java.rmi.Naming.rebind (Naming.Java:160) 
 à be.fortega.knx.server.Main. (Main.Java:25) 
 at be.fortega.knx.server.Main.main (Main.Java:16) 
 Causée par: Java.net.ConnectException: connexion refusée 
 sur Java.net.PlainSocketImpl.socketConnect (Méthode native) 
 sur Java.net.PlainSocketImpl.doConnect (PlainSocketImpl.Java:333) 
 sur Java.net.PlainSocketImpl.connectToAddress (PlainSocketImpl.Java:195) 
 sur Java.net.PlainSocketImpl.connect (PlainSocketImpl.Java:182) 
 sur Java.net.SocksSocketImpl.connect (SocksSocketImpl.Java:433) 
 sur Java.net.Socket.connect (Socket.Java:524) 
 sur Java.net.Socket.connect (Socket.Java:474) 
 sur Java.net.Socket. (Socket.Java:371) 
 sur Java.net.Socket. (Socket.Java:184) 
 sur Sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket (RMIDirectSocketFactory.Java:22) 
 sur Sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket (RMIMasterSocketFactory.Java:128) 
 à Sun.rmi.transport.tcp.TCPEndpoint.newSocket (TCPEndpoint.Java:569) 
 ... 7 autres 

13
Fortega

Cela semble fonctionner quand je remplace le

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

par

LocateRegistry.createRegistry(2020);

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

8
Fortega

eu un problème similaire avec cette exception de connexion. il est lancé soit lorsque le registre n'est pas encore démarré (comme dans votre cas), soit lorsque le registre n'est pas encore exporté (comme dans mon cas).

mais un bref commentaire sur la différence entre les 2 façons de démarrer le registre:

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

exécute le répertoire rmiregistry.exe de javas bin dans un nouveau processus et continue en parallèle avec votre code Java.

LocateRegistry.createRegistry(2020);

l'appel de la méthode rmi démarre le registre, renvoie la référence à cet objet distant du registre, puis continue avec l'instruction suivante.

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

13
AxelTheGerman

Vous devez exécuter une rmiregistry avant de tenter de vous connecter (enregistrer) à un service RMI. 

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

Voir la documentation de LocateRegistry

6
Steen

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

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

vous pouvez voir que le processus rmiregistry.exe s'exécutera 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 supprimé tous vos fichiers Javaw.exe existants et que rmiregistry.exe correspond à vos programmes rmi exécutés.

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;
};

Argument de 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();
    }
  }
}
1
user1008532

il semble que vous deviez définir votre commande en tant que String[], par exemple:

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

cela ressemble au style de main(String[] args).

0
user1613007