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
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie einen Eintrag in der
hosts file
der Maschinen enthält einen Eintrag der formz.B.
Dadurch wird verhindert, RMI sendet die
localhost
host-name als 'call me back' - Adresse.Testen dieser Ansatz, führen Sie den folgenden code vor und nach der Durchführung der änderung.
Es ausgeben sollte eine lokale Adresse, bevor Sie die änderungen und eine nicht-lokale Adresse zu, nachdem die änderungen.
NÖ, keine Idee. Dass gesagt wird, nach der Verwendung von RMI in der Produktion, habe ich lieber etwas anderes statt - die Konfiguration ist ein bisschen schwer zu bekommen zu korrigieren. Und stale RMI stubs Regel 😉
habe ich dazu auf dem server-pc? Ich habe bereits auskommentiert
127.0.0.1 localhost
Linie auf meiner hosts-Datei. Habe ich entfernen müssen?InformationsquelleAutor Robert Munteanu
Verwendung von verschiedenen Versionen des JDK auf jedem server könnte dieses problem verursachen.
Verwenden
java -version
- Befehl, um sicherzustellen, dass Sie die gleiche version der jre.
Diese Antwort ist Unsinn. Die mit verschiedenen Versionen von he-JDK nicht die Ursache Verbindung absagen.
InformationsquelleAutor theoverture