Connexion Rmi refusée avec localhost
-
22-07-2019 - |
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
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)
.