# J2EE Grundlagen - Kommunikation



## Siassei (7. Jul 2010)

Hallo,

folgendes möchte ich zu Versuchszwecken implementieren.

Webseite auf eine J2EE-Server
J2EE Client

Auf der Webseite soll der Benutzer über WebStart einen Client starten. Nun würde ich gerne eine Kommunikation zwischen der Webseite (AJAX) und des Clients erstellen.
Sprich, der Client soll über den Server der Webseite Informationen mitteilen und umgekehrt. Im Versuch möchte ich einen String oder Farbinformationen austauschen.

Leider fehlt mir hier der Ansatz :-( 
Mein größtes Problem ist die Session der Webseite. Wie kann sich der Client mit der Benutzer-Session der Webseite verbinden bzw. kommunizieren?

Gruß,
  Thomas


----------



## X3TitanCore (7. Jul 2010)

HttpClient - HttpComponents HttpClient Overview


----------



## Siassei (7. Jul 2010)

Servus,

ein Fan der X-Serie. Das waren noch Spiele 

Leider kann ich deine Antwort nicht ganz nach voll ziehen. Ich progge zur Zeit nur in meiner Freizeit --> Erfahrungen und Kentnisse begrenzt.
In wie weit nützt mir dein Http Tipp? Ich komme nicht dahinter. Vielleicht liegts auch an der Niederlage :-( und dem Alkohol gehalt 

Die Kommunikation muss über den Server laufen. Dieser soll die Möglichkeit haben das ganze zu protukolieren.
Ein kleines Beispiel:
Drücke ich z.B. auf der Webseite einen Button, dann soll der Hintergrund des Clients auf Grün schalten. Drücke ich den Button auf dem Client, dann soll von mir aus der Hintergrund der Webseite von Weiß auf Blau wechseln.

Wenn sich der User mit dem Webbrowser sich mit dem Webserver verbindet wird doch auf diesem eine Session angelegt. Nach dem Login bekommt der Benutzer eine Seite, mit der der Client gestartet werden kann.
Wie kann ich nun einen Handler einrichten, der den Datenverkehr zwischen EE-Client und Webseite (AJAX) regelt?

Es handelt sich dabei um eine sehr wichtige Frage für mich, da sie essentiell für das Verständnis von Client-Server-Webseite Technologie ist.

Wenn ich deinen Tipp richtig interpretiere, dann müsste
- jeder Http-Request in der gleichen Session auf dem Server landen und das unabhängig vom Programm
- jedes Programm kann auf die Session zugreifen

Das kommt mir doch etwas Spanisch vor. Daher frage ich, ob du das bestätigen kannst. Das würde nämlich bedeuten, dass ich zum  Beispiel folgendes machen kann.
Im Webbrowser A erstelle ich eine Verbindung zu meiner Online-Banking Plattform. Nun übertrage ich den URL für z.B. Überweißungen per Copy&Paste in Browser B und ...
Leider funktioniert das nicht 

Kannst du deinen Link etwas erklären bzw. erläutern wieso mir das weiterhilft?

Gruß,
  Thomas


----------



## X3TitanCore (8. Jul 2010)

Hallo!

Stimmt das ist die X-Reihe. X3 ist für mich die beste Weltraumsimulation die ich kenne.

Also wenn ich das richtig verstehe soll da eine Kommunikation in beide Richtungen stattfinden. Da fällt mir so spontan nur eine Socketverbindung ein, die du mit dem HTTP-Client herstellen könntest. Was mir nicht klar ist warum die Session so wichtig ist. Wenn die Session für den Login wichtig ist, dann könntest du den Login auch in den Client verlagern und die Socketverbindung wird nur aufgebaut wenn der Login richtig war und der Server ein ok sendet.

Mit dem HTTP-Client kannst du die ganzen Sachen machen. Socketverbindungen, HTTP-Verbindungen. Cookies, SSL etc.

Gruß
Dirk


----------



## bananenkasper (8. Jul 2010)

Stehe vor der selben Herausvorderung.
Habe es momentan folgendermassen gelöst:

JEE-Projekt
* Daten-Tier: JPA
* Buisness-Tier (Anwendungslogik): EJB
* UI (web): JSF
* UI (Desktop): "normale" Java Anwendung gestartet über Java-Webstart

Die in den EJBs vorhanden Methoden für die UI <-> Anwendungskommunikation bekommen als Parameter die SessionID des Clients.
Diese SessionID ist im Buisness-Tier zu den Client-spezifischen Daten gemappt.

Webstart Anwendungen können beim Starten Parameter übergeben bekommen, wie eben auch die SessionID.
Da die Desktop-Anwendung über Webstart gestartet wird, bekommt sie beim Starten die entsprechende SessionID mitgeteilt.
Die Anwendung greift ebenso wie das Web-UI über EJBs auf die Anwendungslogik zu und hat, ebenso wie die Web-Anwendung die aktuelle SessionID.

Desktop-Client und Web-Client können so parallel auf die Session-spezifischen Daten zugreifen und diese Session-weit verändern.
Veränderungen dieser Daten werden unmittelbar an Desktop-Client und Web-Client gebroadcastet. (Web-Client muss per AJAX die Daten pollen)

Laut Java-EE5-Spezifikation gibt es einen sogenannten "Application Client". Ich glaube das ist genau das, was im Detail dahinter steckt, hab ich bisher aber nicht nachgeschaut.
Vermute aber stark, dass es nichts weiter ist als eine Desktop-Anwendung, die eben über JNDI und RMI Zugriff auf ein EJB hat...


----------



## Siassei (8. Jul 2010)

Servus,

die Idee mit der Sessions-Id übergabe hatte ich auch schon. Doch irgendwie scheint mir das zu unsicher zu sein.

Wie stellst du folgendes sicher?
Der Client wird ganz normal gestartet und der User arbeitet damit. Jetzt bricht z.B. die Internetverbindung zusammen und der Benutzer muss sich neu einloggen --> neue Session.
Wie bekommt nun der Client die neue Session mitgeteilt? Ich frage deshalb, da sonst alle Änderungen seit der letzten Übertragung, die im Client gemacht worden sind, verloren gehen würden.



> Veränderungen dieser Daten werden unmittelbar an Desktop-Client und Web-Client gebroadcastet. (Web-Client muss per AJAX die Daten pollen)


Geschieht das automatisch oder muss ich mich darum kümmern?


----------



## bananenkasper (12. Jul 2010)

Siassei hat gesagt.:


> Wie stellst du folgendes sicher?
> Der Client wird ganz normal gestartet und der User arbeitet damit. Jetzt bricht z.B. die Internetverbindung zusammen und der Benutzer muss sich neu einloggen --> neue Session.
> Wie bekommt nun der Client die neue Session mitgeteilt? Ich frage deshalb, da sonst alle Änderungen seit der letzten Übertragung, die im Client gemacht worden sind, verloren gehen würden.



Wenn die Session, die der Desktop-Client anfragt, ungültig ist, gibts eine Fehlermeldung. Der User muss in diesem Fall den Desktop-Client erneut per Webstart starten. 



Siassei hat gesagt.:


> Geschieht das automatisch oder muss ich mich darum kümmern?



Darum musst du dich selbst kümmern. Nutzte dafür Richfaces, das bringt AJAX-Support. Damit geht sowas sehr einfach.


----------

