Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TCP Socket (+ HTTP_GET) möglichst ohne Komponenten (https://www.delphipraxis.net/141978-tcp-socket-http_get-moeglichst-ohne-komponenten.html)

chri_ri 20. Okt 2009 17:14

Re: TCP Socket (+ HTTP_GET) möglichst ohne Komponenten
 
@sirius:
Also der Code ist genau was ich gesucht habe.
Aber was müsste Ich tun, wenn Ich darüber auch binäre Daten anfordern, sprich eine Datei laden möchte?

Schonmal THX.


Kleiner Gedankeneinwurf (Ich weiß, da müsste ich eigentlich fast einen neuen Thread aufmachen):
Wie müsste Ich eigentlich einen HTTP_GET Request bzw. das Anfordern von binären Daten unter Linux realisieren?


@shmia:
Den Titel hatte Ich deshalb so gewählt, da Ich zuerst nach einer Möglichkeit gesucht hatte um überhaupt im Rahmen meiner Bedingungen einen kleinen TCP Client zu realisieren, um den HTTP_GET Request dann einfach nach dem Verbindungsaufbau mit z.B. "GET /index.php?... HTTP/1.1 ...." auszuführen.
Außerdem wäre ein kleiner TCP Client auch sehr praktisch gewesen, da ich auch eine einfacht TCP-Kommunikation (paar Befehle zwischen zwei Anwendungen über Netzwerk austauachen) für eine andere Anwendung suche.



mfg. chri_ri

sirius 20. Okt 2009 18:17

Re: TCP Socket (+ HTTP_GET) möglichst ohne Komponenten
 
Bei BinärenDaten liefert die Methode Responsetext einen Fehler. Jetzt musst du ResponseBody verwenden.
Dieses liefert dir ein eindimensionales varArray zurück, auf dessen Inhalt du dann folgendermaßen zugreifen kannst:
(Achtung du musst jetzt die Unit Variants einbinden, welche dein Programm gleich wieder ein schönes Stück größer macht)

Delphi-Quellcode:
var vArray:Variant;

//also anstatt Responsetext:
vArray:=XMLHttpRequest.responsebody;
Zugriff geht jetzt bspw. über vArray[0] bis vArray[x]. Die einzelnen Bytes kannst du jetzt in eine Datei speichern oder anzeigen, wenn du sie interpretieren kannst.
Von wo bis wo das Array im Index läuft bekommst du über die Funktionen varArrayLowBound(vArray,1) und VarArrayHighBound(...) heraus. Die eins steht für die erste Dimension (in diesem Fall ist nur eine zu erwarten)
Mit VarArrayLock bekommst du einen Zeiger auf die gesamten Daten, den man recht simpel speichern kann, das sähe folgendermaßen aus:
Delphi-Quellcode:
procedure SaveToFile(x:Variant);
var len:Integer;
    Data:Pointer;
    hFile:THandle;
    temp:Cardinal;
begin
  len:=VarArrayHighBound(x,1)-VarArrayLowBound(x,1);//Länge ermitteln
  Data:=VarArrayLock(x); //Pointer auf den ArrayInhalt bekommen
  try
    hfile:=CreateFile('D:\test.jpg',Generic_Write,0,nil,Create_Always,0,0); //Datei öffnen über WinAPI (ich habe als test ein JPG-Bild geladen)
    try
      Writefile(hfile,Data^,len,temp,nil); //Inhalt schreiben (Achtung! Derzeit keine Fehlerbehandlung)
    finally
      closehandle(hFile); //Datei schließen
    end;
  finally
    VarArrayUnlock(x); //Zugriff auf Array wieder freigeben
  end;
end;

Edit:
Um ohne den Comfort der Unit Variants auszukommen (EXE-Datei wird kleiner) geht obige Funktion auch so:
Delphi-Quellcode:
procedure SaveToFile(x:Variant);
var len:Integer;
    psa:PSafeArray;
    Data:Pointer;
    hFile:THandle;
    temp:Cardinal;
    UBound,LBound:Integer;
begin
  psa:=PSafeArray(TVarData(x).VArray);
  SafeArrayGetUBound(psa,1,UBound);
  SafeArrayGetLBound(psa,1,LBound);
  len:=UBound-LBound;
  SafeArrayAccessData(psa,Data);
  try
    hfile:=CreateFile('D:\test.jpg',Generic_Write,0,nil,Create_Always,0,0);
    try
      Writefile(hfile,Data^,len,temp,nil);
    finally
      closehandle(hFile);
    end;
  finally
    SafeArrayUnaccessData(psa);
  end;
end;
Edit2:
All das funktioniert nur, wenn auf dem Rechner der IE installiert ist (wovon man derzeit noch ausgehen kann). Aber andere Browser gehen eben mit der Änderung des Ressourcenstrings auch (sollten zumindest). Das liegt daran, dass diese Klasse die hier benutzt wird quasi standardisiert ist (den genauen Status kenne ich leider nicht). Und deshalb sind diese Funktionen wohl auch in Linux verfügbar. Wie man das aber dort macht, weiß ich nicht.

chri_ri 21. Okt 2009 14:01

Re: TCP Socket (+ HTTP_GET) möglichst ohne Komponenten
 
Mal wieder vielen Dank!^^

Muss das erstmal ausprobieren. Habe jetzt keine Zeit. Gebe später mein Feedback.

Werde das auch mal unter Linux (Debian 5.0.3 x86) ausprobieren^^



mfg. chri_ri


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 Uhr.
Seite 2 von 2     12   

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