AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy (IdHTTP) im Download Stream lesen
Thema durchsuchen
Ansicht
Themen-Optionen

Indy (IdHTTP) im Download Stream lesen

Ein Thema von endeffects · begonnen am 25. Apr 2008 · letzter Beitrag vom 29. Apr 2008
Antwort Antwort
Seite 1 von 2  1 2      
endeffects

Registriert seit: 27. Jun 2004
450 Beiträge
 
#1

Indy (IdHTTP) im Download Stream lesen

  Alt 25. Apr 2008, 17:14
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
  Mit Zitat antworten Zitat
endeffects

Registriert seit: 27. Jun 2004
450 Beiträge
 
#2

Re: Indy (IdHTTP) im Download Stream lesen

  Alt 25. Apr 2008, 17:34
hmm also ich hab nun folgendes versucht:

ersteinmal das onwork event zuweisen und
den den stream starten:
Delphi-Quellcode:
    IdHTTP.OnWork:= HTTPWork;
    IdHTTP.Get('http://81.167.88.3:8000', FS);
anschließend den stream in einen string kopieren,
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:
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;
SmartPos ist übrigens nur eine schnellere variante
der pos() methode, an der liegts nicht
  Mit Zitat antworten Zitat
endeffects

Registriert seit: 27. Jun 2004
450 Beiträge
 
#3

Re: Indy (IdHTTP) im Download Stream lesen

  Alt 28. Apr 2008, 19:22
weiß denn niemand eine antwort? =(
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Indy (IdHTTP) im Download Stream lesen

  Alt 28. Apr 2008, 19:44
Das OnWork Event ist IMHO nur dazu da, dir eine Rückmeldemöglichkeit zu geben, wie viele Daten schon heruntergeladen sind.
Delphi-Quellcode:
IdHTTP.Get('http://81.167.88.3:8000', FS);
// nach diesem Aufruf sind alle Daten in dem Stream FS geschrieben
Wenn du die Daten in einem String haben möchtest, dann nimm doch einen TStringStream.
Andreas
  Mit Zitat antworten Zitat
endeffects

Registriert seit: 27. Jun 2004
450 Beiträge
 
#5

Re: Indy (IdHTTP) im Download Stream lesen

  Alt 28. Apr 2008, 19:49
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Indy (IdHTTP) im Download Stream lesen

  Alt 29. Apr 2008, 11:11
Zitat von endeffects:
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.
Dat mus du vorher sagen.
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;
Andreas
  Mit Zitat antworten Zitat
endeffects

Registriert seit: 27. Jun 2004
450 Beiträge
 
#7

Re: Indy (IdHTTP) im Download Stream lesen

  Alt 29. Apr 2008, 11:15
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: Indy (IdHTTP) im Download Stream lesen

  Alt 29. Apr 2008, 13:51
Hier ist noch ein Artikel, der das Innenleben von Stream etwas beleuchtet:
http://www.delphipraxis.net/internal...ect.php?t=8211

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;
Andreas
  Mit Zitat antworten Zitat
endeffects

Registriert seit: 27. Jun 2004
450 Beiträge
 
#9

Re: Indy (IdHTTP) im Download Stream lesen

  Alt 29. Apr 2008, 14:24
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:
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;
2) das zweite problem ist etwas haariger, die ersten
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:
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;
...
Hast du vielleicht noch eine Idee wie man das bereinigt?

mfg
  Mit Zitat antworten Zitat
endeffects

Registriert seit: 27. Jun 2004
450 Beiträge
 
#10

Re: Indy (IdHTTP) im Download Stream lesen

  Alt 29. Apr 2008, 14:36
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:42 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