# Server -> Client zyklische Daten senden



## MQue (17. Jul 2009)

Hallo,

hätte eine Frage zu einer Client- Server Architektur (in einer EE Umgebung mit einem tomcat) und zwar hab ich auf meinem Server Werte, die ich den Clients schicken möchte und auch eine svg- Datei,
die svg-Datei soll dem Client nach dem einloggen gesendet werden und dann zyklisch (z.B.: alle 2s) die Werte, 
diese Werte sollen dann in die svg- Datei eingebaut werden (da wird mir DOM- Scripting nicht erspart bleiben),

Meine Frage wäre jetzt, wie man es am Besten realisiert, das ich den Clients die SVG- Datei sende und danach gleich zyklisch die Werte (also so eine Art Push-Ajax). Mach ich das mit einem Servlet oder wie würdet Ihr das machen, 
Eine weitere Frage hätte ich auch noch, und zwar werden die Werte ja als XML- Fragmente gesendet damit ich diese dann überhaupt in die svg- Datei einbauen kann, 
hättet Ihr da vielleicht einen Vorschlag, wie man das am Besten realisiert, mit SOAP o.ä.??

lg


----------



## byte (17. Jul 2009)

Du meinst nicht zyklisch sondern periodisch. Ein Zyklus ist was anderes.


----------



## MQue (17. Jul 2009)

byto hat gesagt.:


> Du meinst nicht zyklisch sondern periodisch. Ein Zyklus ist was anderes.



ok, aber ich glaube es ist klar was gemeint ist


----------



## byte (17. Jul 2009)

Um Deine Frage zu beantworten: Servlets können laut Spec. keinen Server Push. Dein Client muss die Werte also periodisch pollen.


----------



## tfa (17. Jul 2009)

Alternativ kann natürlich die Verbindung die ganze Zeit offen bleiben, damit der Server alle 2 Sekunden seine Daten senden kann. Siehe Pushlet: Push technology - Wikipedia, the free encyclopedia


----------



## Noctarius (17. Jul 2009)

tfa hat gesagt.:


> Alternativ kann natürlich die Verbindung die ganze Zeit offen bleiben, damit der Server alle 2 Sekunden seine Daten senden kann. Siehe Pushlet: Push technology - Wikipedia, the free encyclopedia



Besonders schön geht sowas mit gefaktem HTTP/1.0


----------



## musiKk (17. Jul 2009)

Oder man setzt das mit AJAX um. In der Geronimo Console gibt es z. B. einen Graphen, der den Speicherverbrauch anzeigt. Das ist auch ein svg, welches jede Sekunde aktualisiert wird und die neuen Daten anzeigt. Ich bin aber da nicht eingestiegen, wie das genau umgesetzt wurde. Wenn sich bei Google aber nichts einfach finden lässt (was Du natürlich schon probiert hast), dann wäre diese konkrete Umsetzung vielleicht eine gute Inspiration.


----------



## Noctarius (17. Jul 2009)

Mit HttpXmlRequest Objekten lässt sich auch sogenanntes LongTime Polling realisieren (das nutzt z.B. Googles GWT). Du öffnest eine Verbindung zum Server, diese bleibt solange auf bis Daten gekommen sind, der Server baut sie ab, der Client macht sofort eine Neue auf.
Der Effekt ist: Die Daten sind sofort da wenn sie gekommen sind und nicht wie bei periodischem Polling mit Verzögerung.


----------



## byte (17. Jul 2009)

Wäre mir neu, das GWT sowas direkt unterstützt. Hast Du einen Link dazu?


----------



## Noctarius (17. Jul 2009)

byto hat gesagt.:


> Wäre mir neu, das GWT sowas direkt unterstützt. Hast Du einen Link dazu?



Hier aber hab grad gesehen liegt noch im Incubator: ServerPushFAQ - google-web-toolkit-incubator - Explains Server Push, sometimes known as 'comet', and how you can achieve this with GWT. - Google Code


----------



## MQue (17. Jul 2009)

Noctarius hat gesagt.:


> Hier aber hab grad gesehen liegt noch im Incubator: ServerPushFAQ - google-web-toolkit-incubator - Explains Server Push, sometimes known as 'comet', and how you can achieve this with GWT. - Google Code



OK, über ein Framework werd ich nicht darüber hinwegkommen, da ich 2 Sachen benötige:
1. unter anderem bewegte Tabs
2. eben diese asynchrone, periodische Kommunikation

ich hab auch von dem dojo- Framework gelesen (das unterstützt visuelle Effekte), ob mich das bei der Kommunikation auch unterstützt????
Kann man mit dem GWT eigentlich bewegte Tabs realisieren?

lg


----------



## byte (17. Jul 2009)

Noctarius hat gesagt.:


> Hier aber hab grad gesehen liegt noch im Incubator: ServerPushFAQ - google-web-toolkit-incubator - Explains Server Push, sometimes known as 'comet', and how you can achieve this with GWT. - Google Code



Die FAQ gibts schon lange. Da wird aber auch nur beschrieben, wie man Server Push emulieren kann. GWT unterstützt das nicht out of the box.


----------



## byte (17. Jul 2009)

Michael1234 hat gesagt.:


> ich hab auch von dem dojo- Framework gelesen (das unterstützt visuelle Effekte), ob mich das bei der Kommunikation auch unterstützt????
> Kann man mit dem GWT eigentlich bewegte Tabs realisieren?



Was sollen bewegte Tabs bitte sein? Wenns ne Webanwendung werden soll, kannst Du Dir ma YUI angucken. Ansonsten gibts für GWT ne schicke UI Lib namens GXT. Ist aber GPL.


----------



## Noctarius (17. Jul 2009)

Uff ob GWT bewegte Tabs hat (also ich denke mal du meinst frei sortierbare - also Reihenfolge) weiß ich garnicht. Der Vorteil an GWT ist eben, dass du dich nur bedingt mit Javascript rumärgerst (und das Wort meine ich so), da du Java schreibst und der GWT Compiler das Javascript von sich aus erzeugt.

Als Aufsatz auf den GWT Compiler gibt es noch GXT (ExtJS for GWT - Ext GWT - Java Component Library) was aus meiner Sicht noch etwas hübscher aussieht und mehr Controls bietet. Kann aber auch daran liegen, dass wir in der Firma schon lange ExtJS in seiner JS-Reinform einsetzen.

Ansonsten kann ich GWT (bzw GXT) sehr empfehlen. Die Lernkurve ist nicht so steil wie bei anderen Frameworks, es lässt sich zur Not mit anderen integrieren (auf Serverseite versteht sich) - z.B. mit Spring, Hibernate und Anderen und wer schon mal mit Java GUI rumhantiert hat (also Swing / AWT / SWT) der sollte auch mit dem grundlegenden Aufbau von GWT fix klarkommen.

Ansonsten ist ExtJS ansich nicht schlecht aber eben Javascript-"OOP"-Programmierung. Dojo ist ganz nett an sich aber da gefällt mir das Design nicht.

edit: Ok byto war schneller


----------



## MQue (20. Jul 2009)

Vielen Dank für die Vorschläge!!!

@Servlets können laut Spec. keinen Server Push
nochmal zu dem ServerPush, ich hab jetzt probiert, dass ich in einem Servlet ein Thread.sleep mache und dann nochmal was schicke, nichtmal das geht, oder hab ich da was falsch gemacht: 


```
@Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    
        final PrintWriter out = response.getWriter();
        int x = random.nextInt(255);
        out.println(String.valueOf(x));
        try {
            Thread.sleep(1000);
            }
        catch (InterruptedException ex) {
            System.out.println("Ausnahme: " + ex);
            }
        out.println(443);
        }
```


----------



## Noctarius (20. Jul 2009)

Nicht das Servlet kümmert sich um das Push sondern der Client fragt Daten periodisch ab


----------



## MQue (20. Jul 2009)

Das ist schon klar, nur soll ich eine Anwendung schreiben, von dem das Senden vom Server ausgeht, z.B.: soll der client einmal anfragen und der Server sendet dann seine Daten zum Client periodisch bis auf Sankt Nimmerlein wenn die Verbindung nicht abreißt, anderenfalls wieder Verbindung aufbauen und wieder das selbe Spiel.
Und deshalb bin ich auf der Suche nach Anhaltspunkten, wie ich das realisieren kann. Mit Servlets schauts schlecht aus, die Spezi. sagt ja gleich oder gar nicht und der Lifecycle eines Servlets ist auch nicht für das ausgelegt (so schauts jedenfalls aus).
lg


----------



## Noctarius (20. Jul 2009)

Achso du willst den Longtime-Request implementieren. Normal solltest du den Thread anhalten können. Gibt es beim Senden denn eine Fehlermeldung oder hast du mal ein out.flush probiert?


----------



## byte (20. Jul 2009)

Michael1234 hat gesagt.:


> Das ist schon klar, nur soll ich eine Anwendung schreiben, von dem das Senden vom Server ausgeht, z.B.: soll der client einmal anfragen und der Server sendet dann seine Daten zum Client periodisch bis auf Sankt Nimmerlein wenn die Verbindung nicht abreißt, anderenfalls wieder Verbindung aufbauen und wieder das selbe Spiel.
> Und deshalb bin ich auf der Suche nach Anhaltspunkten, wie ich das realisieren kann. Mit Servlets schauts schlecht aus, die Spezi. sagt ja gleich oder gar nicht und der Lifecycle eines Servlets ist auch nicht für das ausgelegt (so schauts jedenfalls aus).
> lg



Du könntest das auch einfach mit RMI machen. Der Client registriert einen Callback, auf dem der Server dann Aufrufe macht, wenn neue Daten da sind.


----------



## MQue (20. Jul 2009)

byto hat gesagt.:


> Du könntest das auch einfach mit RMI machen. Der Client registriert einen Callback, auf dem der Server dann Aufrufe macht, wenn neue Daten da sind.



Mal (wieder) ne blöde frage, geht RMI mit JavaScript oder wie mach ich das?
auf meine Server hab ich als Middleware eh Spring verwendet, aber wie mach ich das beim Client mit dem Browser und wie registriert man dann eine callback- Methode?

Eine callback- Methode mit JS hab ich registriert aber du wirst wahrscheinlich was anderes meinen:


```
function getVariables() {    
    createRequest();
    var url = "ControllerServlet";
    request.open("post", url, true);
    request.onreadystatechange = updatePage;
    request.send(null);    
    }
```

lg


----------



## byte (20. Jul 2009)

Wenn du ein Webfrontend brauchst, dann gehts mit RMI nicht.


----------

