AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke ActiveDesktop / XMLHTTPRequest versus HTTP Server

ActiveDesktop / XMLHTTPRequest versus HTTP Server

Ein Thema von hirnstroem · begonnen am 3. Jan 2011 · letzter Beitrag vom 4. Jan 2011
Antwort Antwort
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#1

ActiveDesktop / XMLHTTPRequest versus HTTP Server

  Alt 3. Jan 2011, 10:15
Hallo Forum,

mittels untenstehendem HTML/JavaScript wird in bestimmten Intervallen eine Verbindung zu einer Delphi Applikation aufgebaut und auf einkommende Daten gewartet, welche, wenn angekommen, in den "Body" geschrieben werden:

Code:
<HTML>
  <HEAD>
    <SCRIPT>
      function refresh() {
        var request = new ActiveXObject('MSXML2.XMLHTTP.3.0');
        request.open("POST", "http://[HOST_NAME]:[PORT]/", true);
        request.onreadystatechange=function () {
          if (request.readyState==4) {
            document.body.innerHTML = request.responseText;
          }
        }
        request.send(null);
        setTimeout("refresh()", [INTERVAL]);
      }
    </SCRIPT>
    <STYLE>BODY { color:white;background-color:black; }</STYLE>
  </HEAD>
  <BODY ONLOAD="refresh()">
  </BODY>
</HTML>
Die Delphi Applikation ist mit einem HTTP Server (TIdHTTPServer) bestückt, welcher auf das "OnCommandGet" Ereigniss reagiert und Daten retourniert:

Code:
procedure TfrmMain.HTTPServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  AResponseInfo.ContentText := Response.Text;
end;
Die Gewünschte Funktionalität ist soweit gewährleistet, nur - und das ist unschön - sind stets sehr viele (ca. 100) Verbindungen mit dem Status "TIME_WAIT" festzustellen (mittels TCPView aus der Sysinternals Suite). Die Anzahl Verbindungen mit Status "TIME_WAIT" wächst nicht ständig weiter, sondern pendelt sich irgendwann ein. Zudem scheint der Windows Explorer den Arbeitsspeicher aufzublähen.

Auf welche Art und Weise können/sollen/müssen die Verbindungen nach der Übertragen geschlossen werden? Da das XMLHTTPRequest Objekt keine Funktion für das Schliessen der Verbindung anbietet, wird dies wohl auf Serverseite geschehen müssen. Auf Serverseite tritt aber bereits ohne weiteres zutun in demselben Intervall, in welchem die Anfragen einkommen, das OnDisconnect Ereigniss auf. Wird die Verbindung "von Hand" geschlossen tritt eine "EIdConnClosedGracefully" Exception mit der Meldung "Connection Closed Gracefully" auf.

Grüsse
hirnstroem
inde deus abest
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
534 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: ActiveDesktop / XMLHTTPRequest versus HTTP Server

  Alt 3. Jan 2011, 11:36
Dein Server muss den nicht mehr verwendeten Socket schliessen.
Bei unseren Server Komponenten (ICS Piette) wird der Client Socket
durch Ip-Adresse, Port und lokalen Client Port identifiziert.
Öffnet nun ein Client einen Socket und es ist parallel ein identischer offen
muss dieser bei uns vom Server mit ClientClass.CloseDelayed geschlossen werden.
Ansonsten kommt es zu den von Dir tonnenweise vorhandenen "offenen Verbindungen".
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#3

AW: ActiveDesktop / XMLHTTPRequest versus HTTP Server

  Alt 3. Jan 2011, 11:55
Überprüfe mal, wie Keep-Alive eingestellt ist (im Header) und gehe den ganzen Ablauf mal mit dem IE direkt und Firefox durch.

Außerdem hast du nen üblen Fehler in deinem JS-Teil: Mit "var request" erzeugst du immer wieder eine globale Variable. Lasse zunächst mal das "var" weg. Alternativ kannst du auch nur 1x das Objekt erzeugen und dann immer wieder verwenden (recyclen). Letzterer Weg sollte freundlicher sein.

Setze weiterhin noch in deinem Delphi-Programm die Cache-Header auf kein Caching.

Bernhard
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#4

AW: ActiveDesktop / XMLHTTPRequest versus HTTP Server

  Alt 4. Jan 2011, 07:15
Vielen Dank für die Antworten! Geschilderte Probleme sind behoben.

Neu...

...ist KeepAlive "true".
...wird nicht mehr zwischengespeichert (Pragma und CacheControl -> no-cache).
...wird nicht ständig ein neues request Objekt (JS) kreiert.
...werden nicht ständig eine neue Sockets benutzt (ReuseSocket -> rsTrue).

Grüsse
hirnstroem
inde deus abest
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 22:20 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