AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Overbyte ICS HTTP Webserver
Thema durchsuchen
Ansicht
Themen-Optionen

Overbyte ICS HTTP Webserver

Ein Thema von schwa226 · begonnen am 6. Jun 2012 · letzter Beitrag vom 6. Jun 2012
Antwort Antwort
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#1

Overbyte ICS HTTP Webserver

  Alt 6. Jun 2012, 15:48
Hallo zusammen!

Anhand dieser HowTo:
http://wiki.overbyte.be/wiki/index.php/TutWebAppServer

habe ich es bereits geschafft Werte in das HTML zu übertragen.
Nun stellt sich mir die Frage wie man ein Feld updated ohne die HTML Seite neu laden zu müssen.
(Also Seite aktualisieren im Webbrowser)

Ich habe es zwar mit Java Script geschafft, dass sich die Seite z.B. jede Sekunde "refreshed" ohne direkt neu laden zu müssen.

Meine Frage ist, aber ob man das nicht von der ICS Komponente direkt (ohne Java Script), sozusagen Event getriggert machen kann das man nur einen bestimmten Wert updated!?
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#2

AW: Overbyte ICS HTTP Webserver

  Alt 6. Jun 2012, 17:04
Kurze Antwort: JEIN (es geht, aber nicht ohne Javascript)

Lange Antwort:

HTTP ist ein zustandsloses und damit verbindungsloses Protokoll, somit kannst du vom Server aus dem Client nicht sagen "tausche diesen Teil im HTML-Dokument aus".
Das liegt einfach daran, dass nach dem Ausliefern der Webseite durch den Server keine Verbindung mehr zwischen Server und Client besteht.
Ein HTTP-Request ist immer gleich: Client fordert die Seite an => Server liefert sie aus => Verbindung wird getrennt.

Wenn du nicht Websocket statt HTTP verwendest, kannst du somit vom Server zum Client keine Nachricht mehr schicken, nachdem die Seite bereits vollständig beim Client angekommen ist und die Verbindung bereits getrennt wurde.
Es muss dazu immer einen vorhergegangenen Request vom Client aus geben.
Somit die kurze Antwort auf deine Frage ("geht es mit HTTP und zugleich ohne Javascript"):
Nein, es geht mit der ICS-Komponente nicht, und auch mit keiner anderen Komponente, da es am HTTP-Protokoll selbst liegt, dass es nicht geht.
Du bräuchtest für dein Vorhaben eine stehende Verbindung zwischen Client und Server, so dass der Server den Client jederzeit benachrichtigen kann, ohne dass der Client zuvor einen Request abgesetzt hat.
Für diese Vorhaben hat man das Websocket-Protokoll als Ersatz / Erweiterung für HTTP entwickelt.
Das können aber leider noch nicht alle populären Browser. (Firefox, Chrome und Safari können es, der IE 9 kanns nicht, bei Opera und beim IE 10 bin ich mir nicht sicher)

Es geht aber dennoch teilweise mit einem "Trick" auch via HTTP mit Hilfe von AJAX:
Auf herkömmliche Weise ohne Websocket macht man so etwas, wie du es vorhast, meist mit einem "AJAX lazy poll".
Das heisst, der Client sendet einen AJAX-Request mit einem langen Timeout an den Server, den der Server nicht sofort beantwortet, sondern erst dann, wenn es später etwas zum updaten gibt.
Gibt es dann nach einiger Zeit etwas zum updaten, beantwortet der Server diesen vorausgegangen Request und sendet meist JSON oder XML zurück, das du clientseitig parst, auswertest und dann die entsprechenden DOM-Elemente via Javascript aktualisierst.
Somit musst du nicht die Seite neu laden, sondern ersetzt anhand der Informationen im JSON / XML einfach Teile der Seite, allerdings clientseitig und eben per Javascript.
Sobald du das JSON / XML geparst und ausgewertet hast, sendest du wieder einen "AJAX lazy poll".
Mit dieser Technik emulierst du zumindest teilweise eine Verbindung bzw. gibst dem Server zumindest die Möglichkeit, verzögert auf einen Client-Request zu antworten.
Das hat den Vorteil, dass du vom Client aus nicht andauernd alle x Sekunden nachfragen / pollen musst, ob es ein Update gibt, sondern setzt nur einen einzigen Poll ab, den der Server erst dann verzögert beantwortet, wenn wirklich etwas zum updaten da ist.

Man muss dabei nur beachten, dass das AJAX-Timeout nicht beliebig lang sein kann und ein weiterer "AJAX lazy poll" gesendet werden muss, wenn das Timeout abläuft.
Ausserdem hat es bei manchen Browsern den Nachteil, dass sie, während der Request offen gehalten wird, durch die browserinterne Ladeanzeige (Progressbar, drehender Kreisel etc.) in der Titel- oder Statusbar permanent anzeigen, dass etwas geladen wird, was manche Benutzer verstört. (Es sieht dann so aus, als würde die Seite nie fertigladen)
Generell funktioniert die Technik aber gut und wird von sehr vielen modernen Webseiten exzessiv verwendet.
In Zukunft wird das ganze dann wohl über Websocket abgewickelt werden, sobald die meisten populären Browser Websocket können.
Allerdings wird auch beim Gebrauch von Websocket meist Javascript von Nöten sein, um clientseitig die Anzeige zu aktualisieren.
(Irgend eine Routine muss ja dann auch das Event vom Server empfangen und auswerten, auch wenn eine stehende Verbindung existiert, und die clientseitige Sprache der Browser ist nunmal in fast allen Fällen derzeit Javascript)

Geändert von blackfin ( 6. Jun 2012 um 18:14 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz