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