RMI ConnectionRefused schon bei Server-binding

Ir3n!cus

Aktives Mitglied
Ich habe ein merkwürdiges Problem mit RMI. Vor etwa zwei Monaten hatte ich die Implementierung des RMI interface bereits lauffähig. Das Server-binding hat funktioniert und ein anderes Java Programm konnte sich darauf verbinden und die Methoden des Server aufrufen. Heute wollte ich die Implementierung weiter ausarbeiten und "plötzlich" lässt sich keine Verbindung zur Registry mehr herstellen. Das "registry.rebind(url, server);" liefert jetzt ein "java.rmi.ConnectException: Connection refused".

Zum debuggen habe ich mal versucht, die Registry Einträge mit einer simplen Schleife auszugeben.
Selbst da kommt "java.rmi.ConnectException: Connection refused", also schon beim Lesen der Registry.

Irgendwie scheint die JVM auf ihre eigene Registry nicht zugreifen zu dürfen.
Das scheint keines der üblichen Probleme zu sein, die man bei Google zu RMI findet. Hat jemand eine Idee?

Java:
public static String registerRmiServer(MyRmiServer server, int port) throws RemoteException {
        String url = String.format("rmi://localhost:%s/%s", port, INTERFACENAME); // INTERFACENAME = "MeinServer", port = 4711
       
        Registry registry;
        try {
            try {
                registry = LocateRegistry.getRegistry(port);
            } catch(RemoteException ex) {
                registry = LocateRegistry.createRegistry(port);
            }
           
           
            // -------- zum debug zusätzlich eingefügt ---------
            System.out.println("listing start");
            for (String entry : registry.list()) {
                System.out.println(entry);
            }
            System.out.println("listing end");
            // ------------------------------------------------------
           
           
        } catch(RemoteException ex) {
            throw new RemoteException(String.format("RMI Registry creation failed for: %s", url), ex);
        }
       
        try {
            registry.rebind(url, server);
        } catch(RemoteException ex) {
            throw new RemoteException(String.format("RMI Server binding failed for: %s", url), ex);
        }
       
        return url;
    }
 
Zuletzt bearbeitet:
Beste Antwort
Das Problem ist, getRegistry erzeugt keine Exception, wenn die entfernte Registry nicht vorhanden ist. Brauchst nen Singleton:

Java:
import java.io.Serial;
import java.io.Serializable;
import java.rmi.NotBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Arrays;

public class RMIExample {
    private static boolean created = false;

    public static class RunnableImpl implements Remote, Runnable, Serializable {
        @Serial
        private static final long serialVersionUID = 1L;
        private int i = 1;

        @Override
        public void run() {
            System.out.println("Hello, world! " + i++)...

Nouser

Mitglied
Java:
public class RmiExample {
    public static final String UNIQUE_BINDING_NAME = "double.string";
    public static Registry registry;
    public static Thread CLIENT_THREAD = new Thread(new Runnable() {

        @Override
        public void run() {
            try {
                DoubleString doubleString = (DoubleString) registry.lookup(UNIQUE_BINDING_NAME);
                System.out.println(doubleString.doubleString("hello"));
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    });

    public static void main(String[] args) {

        try {
            // create registry
            registry = LocateRegistry.createRegistry(2099);
            // the service to export
            final DoubleStringImpl service = new DoubleStringImpl();

            // create remote object stub to bind to registry
            Remote stub = UnicastRemoteObject.exportObject(service, 0);
            registry.bind(UNIQUE_BINDING_NAME, stub);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        CLIENT_THREAD.start();
    }
}


interface DoubleString extends Remote {
    String doubleString(String str) throws RemoteException;
}

class DoubleStringImpl implements DoubleString {
    public String doubleString(String str) throws RemoteException {
        return str + str;
    }
}
 

Ir3n!cus

Aktives Mitglied
Ich habe alle Kombinationen der url durch, mit-ohne Protokollname, mit-ohne Host, mit-ohne Port, usw.
Immer mit dem gleichen Ergebnis. Außerdem hat es ja schon mit dieser Form des "Binding-Namen" funktioniert.

Ich würde auch nicht erwarten, dass es an der url liegt.
Das Auslesen der Registry wirft ja den gleichen Fehler. Dafür brauche ich keine url.
 
Zuletzt bearbeitet:

bärrr

Mitglied
Das Problem ist, getRegistry erzeugt keine Exception, wenn die entfernte Registry nicht vorhanden ist. Brauchst nen Singleton:

Java:
import java.io.Serial;
import java.io.Serializable;
import java.rmi.NotBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Arrays;

public class RMIExample {
    private static boolean created = false;

    public static class RunnableImpl implements Remote, Runnable, Serializable {
        @Serial
        private static final long serialVersionUID = 1L;
        private int i = 1;

        @Override
        public void run() {
            System.out.println("Hello, world! " + i++);
        }
    }

    public static Registry createAndRebind(String host, int port, String name) throws RemoteException {
        if (!created) {
            System.out.println("Creating RMI registry on " + host + ":" + port);
            Registry registry = LocateRegistry.createRegistry(port);
            registry.rebind(name, new RunnableImpl());
            created = true;
            return registry;
        }
        System.out.println("Using existing RMI registry on " + host + ":" + port);
        return LocateRegistry.getRegistry(host, port);
    }

    public static void main(String[] args) throws RemoteException, NotBoundException {
        Registry registry = createAndRebind("localhost", 4699, "Runnable");

        Arrays.stream(registry.list()).forEach(System.out::println);
        ((RunnableImpl) registry.lookup("Runnable")).run();

        ((RunnableImpl) createAndRebind("localhost", 4699, "Runnable").lookup("Runnable")).run();
    }
}

Btw. Ich nehme an, dass du nicht immer "localhost" verwenden wirst ... ansonsten wäre auch null als host für localhost möglich.
 
Beste Antwort

Ir3n!cus

Aktives Mitglied
Das Problem ist, getRegistry erzeugt keine Exception, wenn die entfernte Registry nicht vorhanden ist.
Das ist ja mal spannend. Ich will doch den Zustand der Registry nicht in meinem Programm verwalten.
Das soll sie mal schön selbst tun. Gerade bei einer Funktion die von verschiedenen Programmen genutzt wird. :rolleyes:
Ich habe daher erstmal nur die Reihenfolge ausgetauscht.

Java:
Registry registry;
try {
    try {
        registry = LocateRegistry.createRegistry(port);
    } catch(RemoteException ex) {
        registry = LocateRegistry.getRegistry(port);
    }
       
} catch(RemoteException ex) {
    throw new RemoteException(String.format("RMI Registry creation failed for: %s", url), ex);
}

In den Javadocs steht ja leider sehr ungenau, was zu Exceptions führt.
Da steht auch nicht was genau passiert, wenn die Registry bei "create" schon da ist....
wird sie überschrieben? wird sie erweitert? wird das Internet gelöscht?

Und das "getRegistry" ein valides Objekt zurückgibt, selbst wenn es die Registry auf dem Port nicht gibt, ist auch merkwürdig.

Btw. Ich nehme an, dass du nicht immer "localhost" verwenden wirst ... ansonsten wäre auch null als host für localhost möglich.
Doch bleibt es. Das wird ein API nur für lokale Kommunikation zwischen Programmen.
Aber auch ein guter Tipp. Das habe ich so auch nicht aus der Doku rausgelesen.
 
Zuletzt bearbeitet:

Oneixee5

Top Contributor
Der Code kann nicht richtig sein:
Java:
Registry registry;
try {
    try {
        registry = LocateRegistry.createRegistry(port);
    } catch(RemoteException ex) {
        registry = LocateRegistry.getRegistry(port);
    }
          
} catch(RemoteException ex) {
    throw new RemoteException(String.format("RMI Registry creation failed for: %s", url), ex);
}
In Java werden Exceptions nicht zur Steuerung des Programmflusses verwendet. Wenn ich mir das Tutorial von Oracle anschaue, wird das dort auch nicht so gemacht. Weder Server noch Client verwenden dort: LocateRegistry.createRegistry
 

bärrr

Mitglied
In Java werden Exceptions nicht zur Steuerung des Programmflusses verwendet
Stimmt, das sollte man, wenn möglich, vermeiden.

Das ist ja mal spannend. Ich will doch den Zustand der Registry nicht in meinem Programm verwalten.
Das soll sie mal schön selbst tun. Gerade bei einer Funktion die von verschiedenen Programmen genutzt wird.
Eigentlich brauchst du mindestens zwei Anwendungen, wobei die erste nur die RMI Registry anlegt. Die anderen holen sich die dann mit getRegistry und schauen mit lookup nach, ob alles geht.

Das kann alles auf localhost geschehen, aber muss es nicht. Wenn nicht localhost, dann musst du auch an die Sicherheit denken.^^ Gilt, ähnlich wie RDP, als nicht sicher. ;) (Kenne da den neusten Stand aber nicht genau)

Edit: Gerade mal geschaut, RMI over SSH tunneling wäre sicher, wenn es nicht auf localhost beschränkt is.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B HTTP Webseite unter IP-Addresse nicht aufrufbar - unter Domain schon Netzwerkprogrammierung 9
A Überprüfen, ob Server schon vorhanden ist Netzwerkprogrammierung 4
K Vom Socket lesen wenn das Gegenüber schon disconnected ist? Netzwerkprogrammierung 12
B Upstream messen - gibt es da schon was fertig? Netzwerkprogrammierung 2
H Webserver mit PHP als Java-Programm, gibt es schon so etwas? Netzwerkprogrammierung 12
T Schon wieder: RMI hinter Firewall/Router Netzwerkprogrammierung 6
R Websockets oder server sent events? Netzwerkprogrammierung 2
W Windows 2019-Server Dienste starten unter Nutzer Netzwerkprogrammierung 1
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
E Server mit GUI Netzwerkprogrammierung 4
E FTP FTPS Server gibt Fehlernachricht "522 SSL/TLS required on the data channel" zurück Netzwerkprogrammierung 1
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
Eigenen Rechner als Server? Netzwerkprogrammierung 16
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
J Datei Download vom Server Netzwerkprogrammierung 8
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
J Client-Server und SOAP Netzwerkprogrammierung 23
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
J Multithreaded-Server Netzwerkprogrammierung 21
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
L30nS RMI RMI-Server kann Dialog nicht volkommen anzeigen Netzwerkprogrammierung 2
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
S Von Java auf passwortgeschützten Server zugreifen + Umgang mit Ports Netzwerkprogrammierung 28
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
S Java: Anbindung an einen realen Server? (+ Portfreigabe) Netzwerkprogrammierung 8
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
F NodeJs-Server auf Firebase hosten ? Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
H HTTP Glassfish (v5) Application Server - Bibliothek zur Verfügung stellen Netzwerkprogrammierung 4
B HttpClient - Server (Jetty) - getInputStream - EOF Netzwerkprogrammierung 3
P TCP-Server Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
F Server für Java Applikationen Netzwerkprogrammierung 16
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
G Server-Client IO Problem Netzwerkprogrammierung 6
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
L Socket Wie kann ich checken ob ein User eine Nachricht per Outputstream an den Server gesendet hat? Netzwerkprogrammierung 1
T Jetty Server LOGGING Netzwerkprogrammierung 1
L Strings an Server senden und in MYSQL speichern? Netzwerkprogrammierung 3
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
T server empfängt nur 1 Buchstaben vom String Netzwerkprogrammierung 1
S Spiel mit Server programmieren Netzwerkprogrammierung 2
N Post u Head Request an Server Netzwerkprogrammierung 4
J Socket Ein Chat Server Tutorial Netzwerkprogrammierung 8
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
J Socket Tutorial zu Multiplayer Server schreiben? Netzwerkprogrammierung 5
S Java Chat Server Netzwerkprogrammierung 8
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
D Socket Message an einen Server senden? Netzwerkprogrammierung 8
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
KaffeeFan Programmierung mit Cloud-Server Netzwerkprogrammierung 0
L Socket Problem mit Server Netzwerkprogrammierung 1
cezary Socket Paralleler Server ? Netzwerkprogrammierung 1
I Socket Leicht zu DDosender Server Netzwerkprogrammierung 4
agent47 HTTPs Server Netzwerkprogrammierung 5
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
J Prüfen, ob remote UDT Server erreichbar ist Netzwerkprogrammierung 0
P Server als Client nutzen Netzwerkprogrammierung 8
S Server Kommunikation Netzwerkprogrammierung 1
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
S Webservice - Server Netzwerkprogrammierung 0
M Java Eingabe auf FTP Server übergeben Netzwerkprogrammierung 4
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
M Socket Java Server: NullPointerException Netzwerkprogrammierung 4
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
J Java Server empfängt php inhalt nicht Netzwerkprogrammierung 1
K C# Server - Android Client Netzwerkprogrammierung 0
J Framework mehrere Clients/ Server-Broadcast/oracle XE/ XML Netzwerkprogrammierung 1
D Mit Server Daten austauschen Netzwerkprogrammierung 4

Ähnliche Java Themen


Oben