AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TCP Socket (+ HTTP_GET) möglichst ohne Komponenten
Thema durchsuchen
Ansicht
Themen-Optionen

TCP Socket (+ HTTP_GET) möglichst ohne Komponenten

Ein Thema von chri_ri · begonnen am 20. Okt 2009 · letzter Beitrag vom 21. Okt 2009
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von chri_ri
chri_ri

Registriert seit: 16. Okt 2007
Ort: Markkleeberg
37 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: TCP Socket (+ HTTP_GET) möglichst ohne Komponenten

  Alt 20. Okt 2009, 18:14
@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
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: TCP Socket (+ HTTP_GET) möglichst ohne Komponenten

  Alt 20. Okt 2009, 19:17
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von chri_ri
chri_ri

Registriert seit: 16. Okt 2007
Ort: Markkleeberg
37 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: TCP Socket (+ HTTP_GET) möglichst ohne Komponenten

  Alt 21. Okt 2009, 15:01
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 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