RMI Server Routing Problem

M

mv0101

Hallo!

Ich versuche schon länger dieses Problem zu beseitigen:

Ich habe einen RMI Server und Client, jeweils auf unterschiedlichen Maschinen. Die RMI Registry wird in der zugehörigen Serverklasse gestartet. Danach verbindet sich der Server mit der Registry auf einem über die Kommandozeile angegebenen Port.

Wenn sich nun der Client versucht mit der Registry zu verbinden, kommt lange Zeit keine Verbindung zustande. Erst nach etwa 3-4 Minuten ist es soweit, allerdings wartet man unendlich lange auf die danach folgende Befehlsausführung, d.h. es tut sich gar nichts mehr.

Ich habe bisher herausgefunden, dass das Problem an einem meiner Netzwerkadapter liegt. Eine Auflistung der Adapter ergibt folgendes:

C:\>ipconfig

Windows-IP-Konfiguration

Ethernetadapter VMware Network Adapter VMnet8:

Verbindungsspezifisches DNS-Suffix:
IP-Adresse. . . . . . . . . . . . : 192.168.116.1
Subnetzmaske. . . . . . . . . . . : 255.255.255.0
Standardgateway . . . . . . . . . :

Ethernetadapter VMware Network Adapter VMnet1:

Verbindungsspezifisches DNS-Suffix:
IP-Adresse. . . . . . . . . . . . : 192.168.187.1
Subnetzmaske. . . . . . . . . . . : 255.255.255.0
Standardgateway . . . . . . . . . :

Ethernetadapter LAN-Verbindung:

Verbindungsspezifisches DNS-Suffix:
IP-Adresse. . . . . . . . . . . . : 192.168.1.45
Subnetzmaske. . . . . . . . . . . : 255.255.255.0
Standardgateway . . . . . . . . . : 192.168.1.1

Ethernetadapter Hamachi:

Verbindungsspezifisches DNS-Suffix:
IP-Adresse. . . . . . . . . . . . : 5.40.203.42
Subnetzmaske. . . . . . . . . . . : 255.0.0.0
Standardgateway . . . . . . . . . :

Ethernetadapter VirtualBox Host-Only Network:

Verbindungsspezifisches DNS-Suffix:
IP-Adresse (Autokonfig.). . . . . : 169.254.0.35
Subnetzmaske. . . . . . . . . . . : 255.255.0.0
Standardgateway . . . . . . . . . :

Dabei macht der Adapter "VirtualBox Host-Only Network" die Probleme. Dieser verbindet sich ständig mit der Anwendung und setzt DGC-Calls ab. Die Anwendung lässt den Client erst verbinden, nachdem ich den o.a. Adapter deaktiviert habe.

An einem anderen Rechner, wo ich das ganze ausprobiert habe, macht das Hamachi-Interface die gleichen Probleme. Dabei habe ich schon die Registry auf dem ausgewählten Interface (192.168.1.45) gestartet.


Der Server-Code:

public class Server {

public static void main (String[] args) throws UnknownHostException {
try {
int port = Integer.parseInt(args[1]);
String host = args[0];

LocateRegistry.createRegistry(port);

// Proxy remote object
UtilsImpl utils = new UtilsImpl();
Utils stub = (Utils) UnicastRemoteObject.exportObject(utils, port);
RemoteServer.setLog(System.out);

Registry registry = LocateRegistry.getRegistry(host, port);
registry.rebind("Utils", stub);

System.out.println("Running on port " + port);

} catch (RemoteException e) {
e.printStackTrace();

} catch (NumberFormatException e) {
System.out.println("Wrong startup parameter.");

}
}
}



Der Client-Code (abgekürzt):

String host = args[0];
int port = Integer.parseInt(args[1]);

Registry registry = LocateRegistry.getRegistry(host, port);
final Utils utils = (Utils) registry.lookup("Utils");


Hier das Server-Logfile:

06.01.2010 14:44:13 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(1)-192.168.1.45: [192.168.1.45: sun.rmi.registry.RegistryImpl[0:0:0, 0]: void rebind(java.lang.String, java.rmi.Remote)]
06.01.2010 14:44:13 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(2)-169.254.0.35: [169.254.0.35: sun.rmi.transport.DGCImpl[0:0:0, 2]: java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[], long, java.rmi.dgc.Lease)]
Running on port 1099
06.01.2010 14:49:13 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(3)-169.254.0.35: [169.254.0.35: sun.rmi.transport.DGCImpl[0:0:0, 2]: java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[], long, java.rmi.dgc.Lease)]
06.01.2010 14:54:13 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(4)-169.254.0.35: [169.254.0.35: sun.rmi.transport.DGCImpl[0:0:0, 2]: java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[], long, java.rmi.dgc.Lease)]



Andauert taucht dort die IP mit der Nummer 169.254.0.35 auf. Ich weiß nicht, wie das sein kann, da die Registry auf einem ganz anderen Interface gestartet wird. Wie oben erwähnt, läuft alles ganz normal, solange das VirtualBox-Interface deaktiviert ist...


Falls jemand einen Rat für mich hat, wäre ich sehr dankbar!


Viele Grüße,

Markus
 
Gelöst

Ich habe vergessen zu sagen, wie ich die Anwendung aufrufe. Bisher geschah dies immer ohne den Schalter -Djava.rmi.server.hostname=%HOSTNAME.
Nimmt man diesen dazu, so startet die Anwendung auf dem richtigen Interface. Wird der Schalter weggelassen, so wird durch die Klasse InetAdapter auf die hosts-Datei des Betriebssystems zurückgegriffen.

Eine Diskussion zu diesem Thema und auch die Anregung zur Lösung (zumindest zu meinem Problem) gibt es hier:

http://www.velocityreviews.com/forums/t131232-strange-rmi-failure.html
 
Zurück