RMI Server im NAT-Netzwerk betreiben
RMI ist ja das Werkzeug schlechthin um verschiedene Javaprozesse miteinander kommunizieren zu lassen. Es können damit entfernte Methoden aufgerufen (Remote Method Invocation) werden, als wäre die Klasse lokal verfügbar. Da sich Java selbst um die ganze Kommunikation über TCP kümmert, hat man natürlich wenig Einflussmöglichkeiten. Betreibt man nun einen RMI-Server hinter einem NAT-Router und möchte diesen vom Internet aus zugreifbar machen, so wird einem immer wieder auf Clientseite eine Exception um die Ohren fliegen, die sagt dass das Netzwerk mit z.B. der IP 192.168.x.x nicht verfügbar wäre. Grund hierfür ist, dass der RMI-Server seine lokale IP nach außen sendet und nicht seine globale IP. Abhilfe schafft hier der Start der Applikation mit einem Parameter:
java -Djava.rmi.server.hostname=GLOBALEIP ...
Ab jetzt sendet der Server die globale IP als Hostnamen und ein Zugriff von Außerhalb ist problemlos möglich.
on Oktober 26th, 2007 at 11:40 am
Blöd wird’s nur, wenn man dem RMI-Server bei einem Methoden-Aufruf eine Callback-Klasse (eine Klasse die ebenfalls von UnicastRemoteObject erbt) mitgibt, damit der Server beispielsweise Events dem Client melden kann. Sitzt der Client dann hinter einem Router fliegt einem alles um die Ohren.
Mich stört’s unheimlich, dass RMI das nichtgebacken bekommt nur die eine Verbindung, die vom Client aufgebaut worden ist, zu benutzen.
Eine Alternative hab ich noch nicht gefunden. Hab schon angefangen selbst was zu basteln, aber das nimmt schon etwas Zeit in anspruch ;-(
on Oktober 27th, 2007 at 10:28 am
Das Problem ist ja, dass RMI die Blocking-Sockets verwendet und das Protokoll nur für einen Thread selbst ausgelegt ist und immer Anfrage und Antwort kommen muss. Eine Überlagerung bzw. parallele Abarbeitung mehrerer Invocations über eine Verbindung ist halt nicht vorgesehen.
Wenn der Client hinter einem NAT-Router sitzt und man den Port weiter leiten kann, sollte es eigentlich analog zu meinem Problem funktionieren. Der Client bei Dir ist ja auch Quasi der Server fürn Server.