it-swarm.com.de

Rmi-Verbindung mit localhost abgelehnt

Ich habe ein Problem mit Java rmi:

Wenn ich versuche, meinen Server auszuführen, erhalte ich eine connectException (siehe unten).

Ausnahme beim Ausführen der Rebind-Methode:

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

wenn Sie stattdessen rmi: // localhost: 2020/RemoteDataPointHandler verwenden, funktioniert es auch nicht. Auch die Verwendung des Standardports funktioniert nicht. Ich habe auch versucht, die IP-Adresse 127.0.0.1 zu verwenden, jedoch mit dem gleichen Effekt.

meine Laufzeit args:

-Djava.security.policy=Java.security.AllPermission
 Ausnahme im Thread "main" Java.rmi.ConnectException: Verbindung zum Host abgelehnt: localhost; verschachtelte Ausnahme ist: 
 Java.net.ConnectException: Verbindung abgelehnt 
 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 (unbekannte Quelle) 
 bei 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) 
 Ursache: Java.net.ConnectException: Verbindung abgelehnt 
 bei Java.net.PlainSocketImpl.socketConnect (native Methode) 
 bei Java.net.PlainSocketImpl.doConnect (PlainSocketImpl.Java:333) 
 bei Java.net.PlainSocketImpl.connectToAddress (PlainSocketImpl.Java:195) 
 bei Java.net.PlainSocketImpl.connect (PlainSocketImpl.Java:182) 
 bei Java.net.SocksSocketImpl.connect (SocksSocketImpl.Java:433) 
 bei Java.net.Socket.connect (Socket.Java:524) 
 bei Java.net.Socket.connect (Socket.Java:474) 
 unter Java.net.Socket. (Socket.Java:371) 
 unter 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 mehr 

13
Fortega

Es scheint zu funktionieren, wenn ich das ersetze

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

durch

LocateRegistry.createRegistry(2020);

hat jemand eine Idee warum? Was ist der Unterschied?

8
Fortega

hatte ein ähnliches Problem mit dieser Verbindungsausnahme. Es wird entweder geworfen, wenn die Registrierung noch nicht gestartet ist (wie in Ihrem Fall) oder wenn die Registrierung bereits nicht exportiert ist (wie in meinem Fall).

aber ein kurzer Kommentar zum Unterschied zwischen den beiden Möglichkeiten, die Registrierung zu starten:

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

führt die Datei rmiregistry.exe im javas bin-Verzeichnis in einem neuen Prozess aus und fährt parallel mit Ihrem Java-Code fort.

LocateRegistry.createRegistry(2020);

der Aufruf der rmi-Methode startet die Registrierung, gibt den Verweis auf das entfernte Registrierungsobjekt zurück und fährt mit der nächsten Anweisung fort.

in Ihrem Fall wird die Registrierung nicht rechtzeitig gestartet, wenn Sie versuchen, Ihr Objekt zu binden

13
AxelTheGerman

Sie müssen eine rmiregistry ausführen, bevor Sie versuchen, einen RMI-Dienst damit zu verbinden (registrieren). 

Mit dem Methodenaufruf LocateRegistry.createRegistry(2020) wird eine Registrierung an der angegebenen Portnummer erstellt und exportiert. 

Siehe die Dokumentation für LocateRegistry

6
Steen

Ein Unterschied, den wir unter Windows feststellen können, ist:

Wenn Sie Runtime.getRuntime().exec("rmiregistry 1024"); verwenden

der Prozess "rmiregistry.exe" wird in Ihrem Task-Manager ausgeführt

wenn Sie Registry registry = LocateRegistry.createRegistry(1024); verwenden

sie können den Prozess nicht im Task-Manager sehen.

Ich denke, Java behandelt das anders.

und dies ist meine server.policy-datei

Stellen Sie vor dem Ausführen der Anwendung sicher, dass Sie alle Ihre vorhandenen Javaw.exe beendet haben und rmiregistry.exe Ihren rmi-Programmen entspricht, die bereits ausgeführt werden

Der folgende Code funktioniert für mich mit Registry.LocateRegistry() oder

Runtime.getRuntime.exec("");


// Standard extensions get all permissions by default

grant {
    permission Java.security.AllPermission;
};

VM-Argument

-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

es scheint, dass Sie Ihren Befehl als String[] setzen sollten, zum Beispiel:

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

es ist genau wie im Stil von main(String[] args).

0
user1613007