![]() |
Indy (IdHTTP) im Download Stream lesen
Hallo,
ich würde gerne in einem http stream lesen und diesen auswerten wärend er noch läuft. leider weiß ich nicht so recht wie ich das anstellen soll. den stream starte ich über: IdHTTP.Get('..', StreamName); Ich denke ich muss dazu im OnWork Event rumfummeln, allerdings habe ich keine Ahnung wie ich hier auf den Stream zugreifen kann. Hat da Jemand einen Tipp für mich? Mfg |
Re: Indy (IdHTTP) im Download Stream lesen
hmm also ich hab nun folgendes versucht:
ersteinmal das onwork event zuweisen und den den stream starten:
Delphi-Quellcode:
anschließend den stream in einen string kopieren,
IdHTTP.OnWork:= HTTPWork;
IdHTTP.Get('http://81.167.88.3:8000', FS); was allerdings nicht richtig funktioniert, irgendwie landet da nur müll drin. zusätzlich hab ich noch eine abbruchbedingung die den stream nach einer weile beendet, das ganze landet dann in einer datei. wenn ich die datei öffne wird der string den ich im stream finden will auch gefunden. klappt nur leider nicht im onwork event. eine idee was ich falsch mache?
Delphi-Quellcode:
SmartPos ist übrigens nur eine schnellere variante
procedure TMyThreads.HTTPWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
var Buffer, Stream: String; N: Integer; begin N:= 0; N:= IdHTTP.Response.ContentStream.Size; SetLength(Buffer, N); IdHTTP.Response.ContentStream.Read(Buffer[1], N); Stream:= copy(Buffer, 1, MaxInt); if SmartPos('StreamTitle=', Stream, False, 1, True) > 0 then IdHTTP.Disconnect; if AWorkCount >= 200*1024 then IdHTTP.Disconnect; end; der pos() methode, an der liegts nicht :D |
Re: Indy (IdHTTP) im Download Stream lesen
weiß denn niemand eine antwort? =(
|
Re: Indy (IdHTTP) im Download Stream lesen
Das OnWork Event ist IMHO nur dazu da, dir eine Rückmeldemöglichkeit zu geben, wie viele Daten schon heruntergeladen sind.
Delphi-Quellcode:
Wenn du die Daten in einem String haben möchtest, dann nimm doch einen TStringStream.
IdHTTP.Get('http://81.167.88.3:8000', FS);
// nach diesem Aufruf sind alle Daten in dem Stream FS geschrieben |
Re: Indy (IdHTTP) im Download Stream lesen
hallo,
vielen Dank für die Antwort, bei dem Stream handelt es sich allerdings um einen Audio Stream und ich möchte mich nur wenige Sekunden mit dem Sender verbinden um an die Meta Tags zu kommen. Das Problem hierbei ist dass man nicht vorraussagen kann wann der Sender diese Informationen sendet. Deshalb möchte ich den Stream solange durchsuchen bis die entsprechenden Informationen gefunden wurden. Und genau hier habe ich leider das Problem das ich nicht weiß wie ich das anstellen kann. mfg |
Re: Indy (IdHTTP) im Download Stream lesen
Zitat:
Bau dir doch deine eigene Streamklasse (von TStream ableiten) und überlade die Methoden Read, Write und Seek. Nur die Write-Methode braucht einen Inhalt, die anderen bleiben leer.
Delphi-Quellcode:
function TSnifferStream.Write(const Buffer; Count: Longint): Longint;
var s : string; begin SetLength(s, Count); Move(Buffer, s[1], Count); // jetzt sind die Daten im String s und du kannst damit machen was du willst. end; |
Re: Indy (IdHTTP) im Download Stream lesen
juhu =)
ich möchte das ja nicht strapazieren, aber wie man so eine stream klasse baut und die dann noch überläd übersteigt mein wissen etwas. könntest du mir vielleicht ein beispiel zeigen? mfg |
Re: Indy (IdHTTP) im Download Stream lesen
Hier ist noch ein Artikel, der das Innenleben von Stream etwas beleuchtet:
![]() Und hier ein 1. Entwurf der "Schnüffel" Streamklasse:
Delphi-Quellcode:
interface
uses Classes; // ungetestet, da direkt so eingetippt type TSnifferStream = class(TStream) private protected public function Read(var Buffer; Count: Longint): Longint; override; function Write(const Buffer; Count: Longint): Longint; override; function Seek(Offset: Longint; Origin: Word): Longint; override; end; implementation function TSnifferStream.Write(const Buffer; Count: Longint): Longint; var s : string; begin SetLength(s, Count); Move(Buffer, s[1], Count); // jetzt sind die Daten im String s und du kannst damit machen was du willst. end; function TSnifferStream.Read(var Buffer; Count: Longint): Longint; override; begin // nichts tun end; function TSnifferStream.Seek(Offset: Longint; Origin: Word): Longint; override; begin // nichts tun end; |
Re: Indy (IdHTTP) im Download Stream lesen
oh vielen Dank,
das scheint tatsächlich zu funktionieren =)) allerdings gibt es noch 2 probleme: 1) der compiler meckert bei dem "override", und zwar heißt es override sei eine unbekannte anweisung, wenn ich das an diesen beiden stellen entferne dann läßt sich das ganze schonmal kompilieren
Delphi-Quellcode:
2) das zweite problem ist etwas haariger, die ersten
function TSnifferStream.Read(var Buffer; Count: Longint): Longint; override; // << compiler error
begin // nichts tun end; function TSnifferStream.Seek(Offset: Longint; Origin: Word): Longint; override; // << compiler error begin // nichts tun end; daten die im stream landen können problemlos geelsen werden, dann gibt es allerdings einen ausnahmefehler der da lautet: "Es ist eine Exception der Klasse EWriteError aufgetreten. Meldung: Stream-Schreibfehler." Anschließend springt die unit IdTCPConnection auf und zwar in die Methode
Delphi-Quellcode:
Hast du vielleicht noch eine Idee wie man das bereinigt?
procedure TIdTCPConnection.ReadStream(AStream: TStream; AByteCount: Integer = -1;
const AReadUntilDisconnect: Boolean = False); ... if InputBuffer.Size > 0 then begin i := Min(InputBuffer.Size, LWorkCount); InputBuffer.Position := 0; AStream.CopyFrom(InputBuffer, i); InputBuffer.Remove(i); //<< hier gibts den fehler Dec(LWorkCount, i); end; ... mfg |
Re: Indy (IdHTTP) im Download Stream lesen
Zugegeben die Exception tritt nur in der Delphi Umgebung auf,
allerdings musste ich auch feststellen das die Verbindung zum Server offenbar jedesmal unterbrochen und neu aufgebaut wird wenn dieser Fehler auftritt. Was sich natürlich nicht so gut macht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:21 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