Wie muss ich das konfigurieren einer RMI Umgebung, so dass ich in der Lage bin, es zu benutzen, in einem "echten" Netzwerk?

Weil ich nicht implementieren wollen, um ein Kommunikations-Protokoll für mein client-server-basierte Anwendung, implementiert habe ich eine RMI-client und der RMI-server auf beiden Seiten für den Austausch der Informationen zwischen den beiden Komponenten.

Wenn ich versuche, mit meiner Anwendung durch starten der beiden Komponenten auf der gleichen Maschine, alles ist in Ordnung. Aber wenn ich teilen Sie die Komponenten auf zwei verschiedenen Rechnern (Kubuntu 9.04 in einer virtuellen Maschine innerhalb eines Windows-7-RC-Umgebung mit deaktivierter firewall und einer nativen Ubuntu-9.04-Umgebung), wie es scheint, den RMI-client ist nicht in der Lage, die Methoden ausführen, die auf dem server definierte Seite. (Alle Funktionen aufrufen, führt zu einer RMI-exception.)

Momentan habe ich nur die system-property "java.rmi.server.hostname" auf beiden Seiten, um das Netzwerk-interface, welches verwendet werden soll um den Austausch von Daten und eingetragen wird der Standard-port für die Kommunikation mit der rmi-daemon (?) rmid.

Nicht jemand eine Idee hat, was könnte schief gehen? Muss ich für einige andere Parameter, wie "java.rmi.server.codebase" (http://java.sun.com/j2se/1.4.2/docs/guide/rmi/javarmiproperties.html) in der Lage sein, um die Verwendung der RMI-Funktionalität in meiner Anwendung?

Edit: Okay, hier ist einige zusätzliche Informationen für Sie:

In der Initialisierungsphase mein client versucht, eine Verbindung zum RMI-server server-Komponente, die initialisiert wurde, mithilfe der folgenden beiden Methoden:

private void initialize()
{
    //set ip address of rmi server
    System.setProperty("java.rmi.server.hostname", ipAddress);

    //try to register rmi server
    try
    {
        LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
    }
    catch (Exception e)
    {
        //ignore
    }
}

public void start()
{
    System.out.print("starting master control RMI server ...");

    try
    {
        Naming.rebind("MasterControl", this);
    }
    catch (Exception e)
    {
        System.out.println("error: could not initialize master control RMI server");
        System.exit(1);
    }

    //set running flag
    isRunning = true;

    System.out.println(" done");
}

"ipAddress" ist hier die ip-Adresse der Netzwerk-Schnittstelle des server-Komponente.

Die Methode, die verwendet wird, durch die client-Komponente, um die Verbindung herzustellen sieht wie folgt aus:

    public void connect()
{
    //build connection url
    String url = "rmi://" + masterControlIpAddress + "/MasterControl";

    System.out.println(url);

    System.out.print("connecting to master control ...");

    //try to connect to master control server
    while (connection == null)
    {
        try
        {
            connection = (MasterControlInterface) Naming.lookup(url);
            id = connection.register(localIpAddress);
        }
        catch (Exception e)
        {
            //ignore
        }

        if (connection == null)
        {
            try
            {
                Thread.sleep(100);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }

    System.out.println(" done");
}

Wie Sie sehen können, mein client ruft eine Funktion zu registrieren die Verbindung auf dem server:

@Override
public int register(String ipAddress) throws RemoteException
{
    //add connection to registrationHandler
    masterControl.registrationHandler.addConnection(ipAddress);

    //log
    int connectionCount = masterControl.registrationHandler.getConnectionCount();
    System.out.println("slave control (" + ipAddress + ") instance has been registered at the master control server under the following id: " + connectionCount);

    return connectionCount;
}

Wenn ich aus meinem Programm eine echte Netzwerk-Verbindung, wird der text "slave-Steuerung, ..." wird nicht angezeigt, auf der server-Seite. Daher bin ich mir nicht sicher, ob die Funktion wirklich aufgerufen, die von der client-Komponente.

Nachdem die client-Komponente ist intialized es versucht, meldet der server-Komponente durch den Aufruf der folgenden Methode verwenden Sie die RMI-Verbindung zum server:

public void sendInitializationDone()
{
    try
    {
        connection.initializationDone();
    }
    catch (RemoteException e)
    {
        System.out.println("error: could not send 'initializationDone' message to master control");
        System.out.println(e);
        System.exit(1);
    }
}

ein flag zu setzen, die auf der server-Seite.

Der Fehler tritt in dieser Funktion auf der client-Seite:

java.rmi.ConnectException: Connection refused to host 127.0.1.1; nested exception is: java.net.ConnectException: Connection refused.

Ich habe keine Ahnung, warum der Gastgeber ist hier 127.0.1.1 ...

@nos

Natürlich habe ich die windows firewall deaktiviert und den Schutz mechanismn von Kaspersky Internet Security. Ich glaube nicht, dass es eine firewall in meinem Kubuntu. In generell ist es möglich, eine Verbindung herzustellen, weil ich schon mit scp kopieren mein Programm auf dem anderen Computer.

Edit2:

Mhhh, nachdem Sie den Eintrag in der /etc/hosts die sich auf der Maschine, um die ip-Adresse der Maschine, die Sie zu funktionieren scheint, aber nicht wirklich verstehen, warum es das tut ...

BR,

Markus

Die RMI-exceptions wäre schön zu sehen.
Zunächst fügen Sie die Ausnahme, die Sie erhalten, zu sagen, was ist, zu scheitern. Ich nehme an, Sie bereits überprüft, Sie haben grundlegende Vernetzung und läuft zwischen dem host und der virtuellen Maschine ? Überprüfen Sie, dass kubuntu und windows-Rechner ist nicht mit jeder Art von firewall
Ich denke, wir brauchen mehr Informationen.
Ja post die excpetions, und auch den code, stellt die Registrierung und das UnicastRemoteObject auf dem server, und client-code, sucht die registry und ruft die remote gibt.

InformationsquelleAutor Markus | 2009-07-22

Schreibe einen Kommentar