RMI hinter router
-
ICh habe eine RMI Server client anwendung geschrieben die im LAN einwandfrei funkt. Aber über das Interneet gibt es Probleme :
Wenn der Server hinter einem Router läuft ist das RMI objekt auf die lokale IP registriert. Nun kann der client das server objekt auf holen. (Ports sind geroutet).Aber der client kann keine Methoden aufrufen da im Objekt nur die lokale
IP des Servers steht. Mit der kann er natürlich nichts anfangen. Wie kann ich jetzt das ServerObjekt auf die externe IP binden ?
-
Hast du in der Routingtabelle die IP deines Servers eingetragen.
Jedenfalls liegt es nicht am RMI. Du solltest mal kurz dein Netztopologie erläutern.Cu
-
Meine Topologie sieht folgendermaßen aus:
Clientseite:
Ein PC 192.168.0.10
Dlink Router 192.168.0.1 und die externeServerseite:
Ein PC 192.168.0.10
Dlink Router 192.168.0.1 und die externeAnder
Meine Ports sind in der Routing Tabelle eingetragen. Ich kann mir das RMI Objekt ja auch laden. Nur kann ich dann mit diesem keine Methoden ausführen.
In dem RMI objekt steht nicht die IP des Servers den er im Internet hat(Adresse seines Routers) sondern seine interne IP Adresse(192.168.0.10). Mit dieser kann ich aber ja nichts anfangen.Ich brauche die Adresse des Routers.
-
Deine Angaben sind zieml. rar. 1. Würde ich für die verschiedenen Router verschiedene IP's vergeben, so dass auch ein aussenstehender erkennen kann das es unterschiedl. Netze sind. Zweitens scheint mir dein Router auf der RMI-Client Seite nicht richtig konfiguriert zu sein. Kannst du den Router und den RMI-Server anpingen?
Sind beide Level C Netze?
-
OK. Problem gelöst.
ICh muste nur die Zeile :
System.setProperty("java.rmi.server.hostname","80.131.59.250");
schreiben. Damit wird dann nicht meine Interne IP in das RMI Objekt geschrieben.
-
Ein weiteres Problem ist aufgetaucht das ich aber schon gelöst habe aber der vollstädigkeit hier noch erwänhen will:
Wenn das RMI Server objekt erstellt wird bekommt es einen zufälligen Port zugewiesen. Damit meine ich nicht deb Port der Registry. Das ist im Lan egal aber im Internet wird es zu einem problem.
Lösung:
BEim erstellen der der abgeleiteten Klasse von dem UnicatsRemoteObjekt den Konstruktor des UnicastRemoteObjekt explisit aufrufen mit :super(meinPort);
Gruss Sven