Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   ActiveDesktop / XMLHTTPRequest versus HTTP Server (https://www.delphipraxis.net/157206-activedesktop-xmlhttprequest-versus-http-server.html)

hirnstroem 3. Jan 2011 09:15

ActiveDesktop / XMLHTTPRequest versus HTTP Server
 
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

taveuni 3. Jan 2011 10:36

AW: ActiveDesktop / XMLHTTPRequest versus HTTP Server
 
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".

rollstuhlfahrer 3. Jan 2011 10:55

AW: ActiveDesktop / XMLHTTPRequest versus HTTP Server
 
Ü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

hirnstroem 4. Jan 2011 06:15

AW: ActiveDesktop / XMLHTTPRequest versus HTTP Server
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:24 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