![]() |
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:
Die Delphi Applikation ist mit einem HTTP Server (TIdHTTPServer) bestückt, welcher auf das "OnCommandGet" Ereigniss reagiert und Daten retourniert:
<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>
Code:
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.
procedure TfrmMain.HTTPServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin AResponseInfo.ContentText := Response.Text; end; 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 |
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". |
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 |
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 04:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz