Question

J'ai un problème d'utilisation de java rmi:

Lorsque j'essaie de faire fonctionner mon serveur, j'obtiens 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.

mes arguments d'exécution:

-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

Était-ce utile?

La solution 2

Cela semble fonctionner lorsque je remplace le

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

par

LocateRegistry.createRegistry(2020);

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

Autres conseils

a 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 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

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

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

Voir la documentation sur LocateRegistry

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 sera exécuté 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 différemment.

et ceci est mon fichier server.policy

Avant d’exécuter l’application, assurez-vous d’avoir tué tous vos fichiers existants. javaw.exe et rmiregistry.exe correspondent à vos programmes 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;
};

Argument de la machine virtuelle

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

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

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top