![]() |
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 |
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:
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.
var vArray:Variant;
//also anstatt Responsetext: vArray:=XMLHttpRequest.responsebody; 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:
Edit2:
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; 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. |
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. |
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