Auf Kriegsfuß mit RMI!

@frozen
also mit glauben hat das wenig zu tun. Also versuch es doch einfach mal! Selbst wenn du das Interface hast lässt sich das Objekt nicht bilden!

Code:
Server server = (Server)Naming.lookup("rmi://:1234/Server");

"Server" ist das Interface. Hast du schonmal ein Casting mit nem Interface gemacht?! Also ich nicht!! Dann brauch ich also auch die Klasse die dieses Interface implementiert. Und dann fehlt mir der Sinn zu RMI. Weil ich die Implementierung ja von Server bekommen möchte/muss.

Also zusammengefasst: Ich möchte RMI auf meinem Rechner simulieren, aber so dass es funktioniert auch wenn Client und Server nicht im gleichen Projekt liegen! Wenn es im selben Projekt liegt gehts bei mir schon, aber das ist ja wohl realitätsfern oder?! Alle Tutorials die ich nun gefunden habe zuzüglich Javabuch5 und Java Insel 7 geben mir nur Beispiele im selben Projekt.
Ich muss also wissen welche Klassen bzw. Dateien(ausser die im JDK6 enthaltenen) ich als Client benötige um eine RMI-Verbindung zu einem Server herzustellen!!
 
Zuletzt bearbeitet:
Was an meiner Antwort hast du nicht verstanden? Gemeinsam genutzte Interfaces und Datentypen MÜSSEN sowohl im Classpath des Clients als auch des Servers liegen. Daher die einfachste bewährte Methode, diese Klassen in ein extra Jar auszulagern. Entweder du bildest das über den Buildprozess ab oder machst halt in Eclipse ein extra Projekt.

Gruß
Ollie
 
halt mich ruhig für be.....! Aber was ich nicht verstanden habe ich die Tatsache dass ich diese Klassen bzw. Interfaces meines Rechner UND dem Rechner des Servers bekannt machen muss. Classpath ist mir klar, aber wie bewerkstellige ich das mit einem fernen Rechner? Wie kann ich dem denn die Classpath einrichten? Ist ja nicht meiner!:)
 
Ähm, du weißt nicht, was der Classpath ist? Hm... von vorn. Der Classpath ist die Summe aller der Anwendung zur Verfügung stehenden Klassen und setzt sich meist aus den Anwendungsklassen und diversen Bibliotheken zusammen.

Wenn du nun das Interface nur im Serverprojekt hast, liegt es nur dort im Classpath. Im Clientprojekt fehlt es, und kann daher nicht bekannt gemacht werden. Die Lösung ist nun, die betreffenden Klassen die beide Projekte benötigen (das Serverprojekt stellt eine Implementierung bereit, das Clientprojekt nutzt die Implementierung durch Das interface hindurch) in ein separates Projekt und sagt dann: Serverprojekt benötigt Common, Clientprojekt benötigt Common.

Wie drückst du nun "benötigt" aus? In Eclipse kannst du einfach über ProjectProperties -> BuildPath das Common Projekt zu Server- und Clientprojekt hinzufügen. Oder aber du erstellst aus dem Commonprojekt ein JAR und fügst dass über den gleichen mechanismus den beiden projekten hinzu.

Gruß
Ollie
 
Nachtrag:

Classpath ist mir klar, aber wie bewerkstellige ich das mit einem fernen Rechner?
Wofür die Erklärung für ClassPath?

Ich merk schon, ich bin nicht sonderlich gut im Beschreiben von Problemen! Also versuch ichs mit einem konkreten Beispiel:

Firma (ABC) hat einen Rechner auf dem eine Klasse liegt die mir einen String zurückliefert. Die Klasse implementiert das Remote-Interface und erweitert UnicastRemoteObject usw.....
Diese Klasse ist in der RMI-Registry angemeledet unter dem Namen "ReturnString".

So...

Ich (macsx) bin Derjenige, der diesen String auf meinem Rechner benötigt Firma (ABC) stellt mir auch gern diesen String zur Verfügung. Ich muss ihn mir nur per RMI holen. Ich habe auch die Informationen bezüglich ihrer URL. (rmi://host:port/ReturnString)!

Also ich kann keine ClassPath auf ein Projekt einrichten, dass auf dem Rechner der Firma (ABC) liegt!! Soweit klar oder?!

Wäre es also üblich/normal, dass ich diese Firma bitte mir das Interface samt der Implementierung zu übergeben?! Aber wo liegt dann der Sinn bei RMI, wenn ich mir die Implementierung doch samt Klasse und Interface geben lassen muss!! Dann kann mir gelich die Klassen geben und auf RMI verzichten!!
 
Zuletzt bearbeitet:
Natürlich muss der Server eine RMI Schnittstelle zur Verfügung stellen. D.h. entweder ist das bereits da. Dann benötigst du aber totzdem das Interface auf dem Client. Dem Client reicht also das Interface. Er muss die Implementierung nicht kennen. DAS ist der Sinn der Sachen (so wie eigentlich immer bei Interface-Implementierungs-Trennung). RMI selbst sorgt quasi nur dafür, dass der Methodenaufruf Server.deineMethode(fubar) nicht an ein lokales Objekt in der selben JVM geht sonder übers Netzwerk an eine entfernte Maschine.

Allerdings scheint mir dein Grundlagenwissen etwas löchrig. "Einen Classpath einrichten" gibt es halt nicht. Für den sorgst du beim Start der Anwendung bzw. beim deployment einer Webanwendung in einen Container (Tomcat z.B.).

Ich glaub ich klink mich erstmal aus, bis wieder konkrete Frage auftauchen. Sonst diskutieren wir zur sehr eine riesige Wolke.

Gruß
Ollie
 
Natürlich muss der Server eine RMI Schnittstelle zur Verfügung stellen. D.h. entweder ist das bereits da. Dann benötigst du aber totzdem das Interface auf dem Client. Dem Client reicht also das Interface. Er muss die Implementierung nicht kennen. DAS ist der Sinn der Sachen (so wie eigentlich immer bei Interface-Implementierungs-Trennung). RMI selbst sorgt quasi nur dafür, dass der Methodenaufruf Server.deineMethode(fubar) nicht an ein lokales Objekt in der selben JVM geht sonder übers Netzwerk an eine entfernte Maschine.

Das ist doch mal die Antwort die gesucht habe und auch verstehe! :)

DANKE!

Es tut mir auch leid, wenn ich dich mit meiner Fragerei genervt habe. Is halt meine Natur! :p
Wenn ichs noch nicht kapiert hab, nachfragen!!

"Dumm kann man ruhig sein, nur zu helfen sollte man sich wissen!"


Dazu kommt dann noch, dass ich leider etwas gefrustet war, weil bei mir der Simulation nicht geklappt hat. Aber das Problem scheint bei meinem Internetanbieter zu liegen, der mir eine IP gibt, mit der ich nicht auf meinen Rechner zurückkomme. Nur bis zum Einwahlknoten! Und auf dem hab ich nun mal keine Zugriffsrechte.
 
Zurück