Einzelnen Beitrag anzeigen

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