[MW] Aufgabe 8 (Jxta)

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

[MW] Aufgabe 8 (Jxta)
Ich hab mit der letzten MW-Aufgabe massive Schwierigkeiten. Das Jxta-Zeug will im CIP einfach nicht funktionieren. Hat das jemand von euch geschafft? Wenn ich den einfachen Jxta-Client starten will, bekomme ich nur diese Fehlermeldung:

java -classpath /local/jxta/lib/jxta.jar:/usr/share/ant/lib/ant-apache-log4j.jar:. -DJXTA_HOME=/home/cip/2002/siyvgoer/.jxta LibraryFrontend
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Priority
        at LibraryFrontend.<init>(LibraryFrontend.java:156)
        at LibraryFrontend.main(LibraryFrontend.java:42)
make: *** [run] Error 1

Das ist LibraryFrontend.java:156:

netPeerGroup = PeerGroupFactory.newNetPeerGroup();

War schon gar nicht so einfach, dieses log4j überhaupt zu finden, weil die ganzen Libs im CIP nicht an der Stelle sind, die auf den Übungsfolien angegeben ist. Offiziellen Support gibt’s derzeit leider nicht und ich will das Teil jetzt möglichst bald fertig haben.


Beim den jxta-libs is doch auch ein logger dabei (steht auch auf den Übungsfolien) - warum nimmst du nicht den?
Also mein jxta lief, aber frage lieber nicht was das für ein gefummel war bis es ging.


Ich weiß nicht, wie dieses Jxta aufgebaut ist, aber ohne classpath für den Logger ging’s nicht und der auf der Folie existiert im CIP nicht. Was ich da angegeben hab war das einzige, was locate gefunden hat. Mir ist nicht so recht klar, wozu dieser Logger überhaupt gut sein soll, ich brauch ihn doch gar nicht, aber scheinbar kann Jxta ohne den nicht.


Hi,

das Problem hatte ich am Anfang auch, der korrekte Classpath ist:

java -classpath /local/jxta/lib/jxta.jar:/local/jxta/lib/log4j.jar:/local/jxta/lib/bcprov-jdk14.jar:. -DJXTA_HOME=${HOME}/jxta_client JXTAClient

Ich habe allerdings das Problem, dass mein Client die Ads, die der Server in der NetGroup veroeffentlicht hat, nicht findet. Hat einer eine Ahnung, warum das sein koennte?


Danke, mit dem classpath startet das Programm zumindest mal. Nach seitenweise Müll, dem vermissten X-Server und einer ignorierbaren Exception seh ich auch den Prompt meiner Anwendung. Und das bei jedem Aufruf - schaut ziemlich buggy aus so. Naja, egal, jetzt wär’s toll, wenn ich noch nützliche Meldungen finden würde - oder gehen die im Gewühl einfach nur unter?

Update: Nein, gehen nicht unter. Es gibt in der Net Peer Group bloß niemanden, der einen “LibraryService” anbietet. Ich mach mal weiter mit der Aufgabe…


ich werd mal meinen server im cip starten - mal sehen wie lang der process checker mitmacht


Seltsame Aufgabe. Ich soll jetzt eine Serverauflistung machen und mich mit einem Server verbinden - aber da ist gar keiner. Wie soll das bitte gehen?

Außerdem wird imo aus der Aufgabenstellung nicht klar, ob der Service vom Client oder in einem neuen Programm implementiert werden soll. Bisher gab es dafür immer verschiedene Programme - meine Alltagserfahrung mit P2P-Programmen sieht allerdings so aus, dass Clients gleichzeitig Server sind. Kann das jemand aufklären?


Ja, das ist in der Tat so bissl doof in der Aufgabe. Server gibt es nur, wenn jemand einen gestartet hat. Netterweise haben die inf4er Leute aber keinen gestartet. Drum kannst du den Teil1 der Aufgabe erst testen, wenn du Teil 2 fertig hast.

Die p2p Komponente in dieser Aufgabe sorgt ja nur dafür dass man sich gegenseitig findet. Die Kommunikation ist dann wieder Client/Server basiert.


Mal schauen wie weit ich komm. Ansonsten wird das Ding zuende geschrieben, kompiliert und ungetestet abgegeben, wenn’s net anders geht. Ich hab langsam auch mal wieder was anderes zu tun… Ständig dieses Rumgetue mit dem unfertigen und schlecht dokumentieren Kram hier. :#:

Aber so richtig blick ich da noch net durch. In den früheren Aufgaben wurde ja RMI oder sonstwas für die c2s-Verbindung verwendet. Diesmal steht da was von einem „einfachen zeichenbasierten Protokoll“. Soll ich da nun ein TCP-Socket aufmachen oder geht das auch irgendwie durch Jxta durch und ist damit effektiv „p2p“ und nicht „c2s“?


Jetzt verstehe ich was du meinst. Da sollen diese jxta Nachrichten verwendet werden. Die funktionieren immer nach einem : Prinzip. Du sendest an den Server Nachrichten mit dem Key „operation“ und als value das was getan werden soll. Der Server muss dann diese Nachrichten einlesen und dann entsprechend antworten. Also nichts mehr mit serialisieren oder sowas.


Aha. Folgende offene Fragen halten mich momentan davon ab, weiterzumachen:

  • Für die Serverliste soll ich den Creator des gefundenen Servers anzeigen. Wo kommt dieser Wert her?
  • Um zu einem Server zu “verbinden”, muss ich eine BiDiPipe dahin öffnen. Woher bekomme ich das Module Spec Advertisement? Woher bekomme ich das PipeAdvertisement?
    Scheinbar bleibt mir nichts anderes übrig, als einen eigenen Serverprozess zu machen, da das mit dem gegenseitigen Warten auf Messages sonst nicht hinhaut. Mann, das ganze Zeug nochmal kopieren…

Du bekommst beim discoveryEvent Advertisments geliefert. Wenn da ein ModuleSpecAdvertisment dabei is, dann kannst du das mit getCreator() nach dem Namen Fragen.

Du musst nach Diensten mittels des Discovery Service suchen. Dieser Service liefert dir dann asynchron DiscoveryEvents in denen die gefundenen Advertisments drinstecken. Dort habe ich mir dann die Advertisments mittels Hashtable als Creator:Advertisment gemerkt. Bei einem Connect wird dann das entsprechende Adv hergenommen und sich damit verbunden.


Meinst du diese Funktion hier?
http://platform.jxta.org/nonav/java/api/net/jxta/protocol/PeerAdvertisement.html#getAdvertisementType()
Die sagt mir angeblich, was für ein Typ Advertisement ich da grad hab. Leider verrät man dort nirgends, welche Werte die Funktionsrückgabe annehmen kann. Außerdem enthält diese Klasse keine Methode “getCreator”. Also ist entweder diese Doku falsch oder der Beispielcode auf den Folien passt nicht zum Thema.


ich hatte mehr an sowas gedacht:

Enumeration en = res.getAdvertisements();
		while (en.hasMoreElements()) {
			try {
				Advertisement ad = (Advertisement) en.nextElement();
				if(!ad.getAdvType().equals(ModuleSpecAdvertisement.getAdvertisementType()))
				{
					continue;
				}
				ModuleSpecAdvertisement madv = (ModuleSpecAdvertisement) ad;
				if(!services.containsKey(madv.getCreator()))
				{
					System.out.println("Peer name: " + madv.getCreator());
					services.put(madv.getCreator(), madv);
				}

Meine Höflichkeit verbietet es mir, jetzt dazu was zu sagen… :wink:


Wie kann man eigentlich neue Advertisements erstellen? Ich hab AdvertisementFactory.newAdvertisement(String type) gefunden, kenne aber die passenden Werte für type nicht. Jemand ne Idee? Ich brauche ein Module Class- und ein Module Spec Advertisement.


Es gibt zum Beispiel ein ModuleClassAdvertisement.getAdvertisementType(). Geh am besten mal auf der jxta seite bei den tutorials schmöckern - im Grunde musst du einfach nur aus den 3-4 Einführungsbeispielen ein Programm machen und fertig ist die Lösung :wink:


Danke für den Hinweis mit dem Tutorial. Leider ist jetzt seit einer Weile die Jxta-Webseite offline. Mal schauen, wann die wieder lebt.


Also mit dem angehängten Tutorial solltest du zumindest ein stückweit kommen. Hatte das noch zufällig im cip auf Platte.

Attachment:
JXTAService.zip: https://fsi.cs.fau.de/unb-attachments/post_25964/JXTAService.zip


Wie kann ich es jetzt machen, dass der Client den Server findet?