Armin: Daten von Programm an Webbrowser schicken

Hallo

Ich habe folgende Problemstellung. Zur Zeit habe ich ein Webbrowser Interface welches mir ueber ein in C implementiertes CGI Programm Requests an ein API schickt und dann die generierten Daten vom API im Webbrowser aufbereitet darstellt. Das passt so weit ganz gut!

Nun moechte ich jedoch einen Schritt weitergehen: Und zwar soll mir mein API auch Daten zu einem beliebigen Zeitpunkt an meinem Webbrowser schicken koennen ohne dass dazu ein Request vom Browser ausgefuehrt werden muss. Dazu soll eine Verbindung zwischen Browser und API offengehalten werden ueber welche diese dann kommunizieren.
Weiss jemand wie ich das bewerkstelligen kann? Kann ich hier auch irgendwie ueber die CGI Schnittstelle arbeiten? Auf www.pushlets.com sind nette Beispiele fuer JSP gegeben. Jedoch moechte ich wenn es irgendwie geht bei einem in C implementierten CGI bleiben.

Danke fuer konstruktive Beitraege!

Mit besten Gruessen
Armin

  1. Hallo,

    Auf www.pushlets.com sind nette Beispiele fuer JSP gegeben.

    Das Prinzip dahinter ist Folgendes:
    Der Client (Browser) fordert via HTTP (GET bzw. POST) eine Ressource an, die, auf diese Anforderung hin, serverseitig erstellt wird (hier JSP). Der Server liefert als Response die Ressource aber nie fertig aus, sondern liefert Teile und wartet dann, so dass der Client ewig läd und dadurch die Verbindung geöffnet bleibt. Dadurch, dass immer mal wieder Teildaten ausgeliefert werden, werden Timeout-Einstellungen des Clients überlistet. Damit der Browser überhaupt etwas anzeigen kann (etwas zu rendern hat), wird dieser nie ferig werdende Request von einem nicht sichtbaren Frame oder von einem IFrame aus aufgerufen.

    Jedoch moechte ich wenn es irgendwie geht bei einem in C implementierten CGI bleiben.

    Baue das oben beschriebene nach.

    Oder besser überlege es Dir nochmal. Es ist nämlich _kein_ HTTP-Push, sondern ein Endlosrequest.

    viele Grüße

    Axel

    1. Hi

      Oder besser überlege es Dir nochmal. Es ist nämlich _kein_ HTTP-Push, sondern ein Endlosrequest.

      Danke fuer Deine Antwort, aber das Problem ist eben wenn ich nun mal 5 Minuten nix schicke bekomme ich dann nicht ein Timeout problem? Muss ich also alle paar Sekunden einen dummy wert schicken damit die Verbindung aufrecht bleibt? Hab was von Server-Push gelesen aber das scheint ja nur fuer Netscape zu funktionieren sehe ich das richtig?

      Es sollte halt mir IE, Opera und FFix hinhauen!

      Gruss
      Armin

      1. hi,

        Danke fuer Deine Antwort, aber das Problem ist eben wenn ich nun mal 5 Minuten nix schicke bekomme ich dann nicht ein Timeout problem?

        Ja, das sagte Axel doch bereits.

        Muss ich also alle paar Sekunden einen dummy wert schicken damit die Verbindung aufrecht bleibt?

        Ja, das sagte Axel doch bereits.

        (Liegt hier ebenfalls ein Timeout-Problem vor, so das Axels Antwort noch nicht vollständig bis zu deiner Datenverarbeitung vordringen konnte?)

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Okay habe das nun wiefolge gemacht, endlosschleife in meinen CGI C Programm rein und alle 5 Sekunden mach ich ein Update von dem versteckten Frame welches mir den auszufuehrenden Javascript Code enthaelt. Unschoen ist jedoch das ich diese Frame alle paar Sekunden reloaden muss damit der neu geschriebe Javascript Code geladen wird. Gibt es hier keine Realzeitmoeglichkeit dass das Frame sich neu ladet sobald es vom Server geschrieben wird? Weiters frisst mein CGI 90% der Prozessorressourcen auch wenn es sich im Leerlauf (delay) befindet. Ist das normal?

          Gruss
          Armin

          1. Was eigentlich auch noch ganz interessant waere: Wie kann ich dem CGI Programm mitteilen sich selber zu killem wenn ich das Fenster verlasse. Moechte das Zeugs nicht die ganze Zeit im speicher haben ;)

            Gruss
            Armin!

          2. Hallo,

            Okay habe das nun wiefolge gemacht, endlosschleife in meinen CGI C Programm rein und alle 5 Sekunden mach ich ein Update von dem versteckten Frame welches mir den auszufuehrenden Javascript Code enthaelt. Unschoen ist jedoch das ich diese Frame alle paar Sekunden reloaden muss damit der neu geschriebe Javascript Code geladen wird.

            Schau Dir mal die Beispiele bei www.pushlets.com genauer an. Das Prinzip mit dynamischem JavaScript ist dort, dass es eine Funktion push(Parameter) gibt, die in einem SCRIPT-Element in der Frameset-Seite steht. Diese Funktion verändert den Inhalt im sichtbaren Frame entsprechend des übergebenen Parameters. Im unsichbaren Frame wird nun "gestreamt". Das heißt, es wird vom Server folgendes Response erzeugt:
            "<script>parent.push('Inhalt1');</script>" ...thread.sleep()... "<script>parent.push('Inhalt2');</script>" ...thread.sleep()... "<script>parent.push('Inhalt3');</script>" ...

            Weiters frisst mein CGI 90% der Prozessorressourcen auch wenn es sich im Leerlauf (delay) befindet. Ist das normal?

            Das kommt drauf an. JSP läuft als Thread. Das bedeutet, auf ein GET ressource.jsp wird ein neuer Thread für den Response erzeugt und der Server ist sofort wieder bereit für ein neues GET. Kann Dein CGI das auch?

            viele Grüße

            Axel

            1. Hi

              Schau Dir mal die Beispiele bei www.pushlets.com genauer an. Das Prinzip mit dynamischem JavaScript ist dort, dass es eine Funktion push(Parameter) gibt, die in einem SCRIPT-Element in der Frameset-Seite steht. Diese Funktion verändert den Inhalt im sichtbaren Frame entsprechend des übergebenen Parameters. Im unsichbaren Frame wird nun "gestreamt". Das heißt, es wird vom Server folgendes Response erzeugt:
              "<script>parent.push('Inhalt1');</script>" ...thread.sleep()... "<script>parent.push('Inhalt2');</script>" ...thread.sleep()... "<script>parent.push('Inhalt3');</script>" ...

              "Genau" so hab ich es ja gemacht. In meinem CGI hab ich ein delay von
              5 Sekunden. Alle 5 Sekunden schreibe ich eine unsichtbare Frame HTML Seite neu mit  "<script>parent.push('Inhalt1');</script>" ...delay().
               "<script>parent.push('Inhalt1');</script>" ...delay() etc.
              Das Problem ist hier, dass ich auch jedesmal das Frame neu reloaden muss damit die neu geschriebene Pusher.htm Seite ausgefuehrt wird. Das ist schon mal das erste grosse Problem!

              Das kommt drauf an. JSP läuft als Thread. Das bedeutet, auf ein GET ressource.jsp wird ein neuer Thread für den Response erzeugt und der Server ist sofort wieder bereit für ein neues GET. Kann Dein CGI das auch?

              Nein, ich habe das so gemacht wie du gesagt hast. Mit einer endlosschleife. Das ist eben auch noch ein weiteres Problem wie ich wann die Connection steht nun vom Browser mit dem in C++ implementierten CGI kommunizieren kann. Muss ich da auf THreads zurueckgreifen? Mit besten Dank

              Armin