![]() |
Stream versenden mit Indy 10
Hallo,
Folgendes: Ich benutze Indy 10 :!: und will damit über TCPServer bzw. Client einen Stream versenden. Z.B. einen Filestream oder Memorystream. Nun gibt es aber nicht mehr die WriteStream-Methode, die es ja mal gab. Es gibt nur noch die Methode Write. Da kann man auch einen Stream als Argument übergeben, aber nur als TIdStreamVCL. :gruebel: Was soll das und wie kann ich jetzt einen normalen stream versenden? Hat TIdStreamVCL irgendeinen vorteil? Bin für jede Antwort sehr dankbar! Henry |
Re: Stream versenden mit Indy 10
Hallo Leute,
Indy 10 scheint wahrscheinlich noch nicht so sehr vertreten zu sein.. Also ich habe mittlerweile einen Filetransfer zustande bekommen. :-D (unten seht ihr den Code) Das funktioniert, so wie er da steht. Ich bin damit aber irgendwie nicht ganz zufrieden, denn: :coder2: - Ich würde die Datei gerne Paketchenweise übermitteln, um z.b eine Resumefunktion einzubauen, Fortschrittsanzeige zu realisieren oder Multiple Quellen zur Datenübermittlung einzusetzen (wie bei Emule oder ähnlichem) - Transfergeschwindigkeiten zu drosseln. Habt ihr diesbezüglich Ideen? Ich persönlich habe generell noch Verständnisprobleme bezüglich diesem TIdStreamVCL. Wäre für Vorschläge sehr dankbar!! Henry Client:
Delphi-Quellcode:
Server:
procedure TForm1.Button1Click(Sender: TObject);
var datei: TFileStream; stream: TIdStreamVCL; begin if (opendialog1.Execute) then Datei := TFileStream.Create(opendialog1.FileName, fmOpenRead); stream := TIdStreamVCL.Create(datei); client.Connect; client.socket.WriteLn(IntToStr(stream.Size)); client.Socket.WriteBufferOpen; client.Socket.Write(stream); client.Socket.WriteBufferFlush; client.Socket.WriteBufferClose; end;
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var datei: TFileStream; stream: TIdStreamVCL; groesse: Int64; begin datei := TFileStream.Create('test.txt',fmCreate); stream := TIdStreamVCL.Create(datei,true); groesse := StrToInt(AContext.Connection.Socket.ReadLn()); AContext.Connection.Socket.ReadStream(stream, groesse); datei.Free; stream.Free; end; |
Re: Stream versenden mit Indy 10
Auch die Zeit löst manche probleme :mrgreen:
|
Re: Stream versenden mit Indy 10
Zitat:
Also, bei der Paketproblematik (siehe oben) bin ich leider immer noch nicht weitergekommen. Henry |
Re: Stream versenden mit Indy 10
Konkreter: Das Problem ist, dass ich ein TIdStreamVCL nicht so splitten, kopieren und lesen kann wie ich das von einem TMemoryStream oder ähnlichem gewohnt bin.
Wie geht das also bei diesen TIdStreamVCL Streams?? Henry |
Re: Stream versenden mit Indy 10
hab genau das selbe problem..
habs so VERSUCHT zu lösen (geht leider net)..
Delphi-Quellcode:
aber es kommt immer der fehler:
var
stream:TIdStreamVCL; fs:tfilestream; ms:tmemorystream; copysize,gesendet,splitsize:integer; [...] procedure TForm1.Button1Click(Sender: TObject); begin fs:=tfilestream.Create('c:\stats.jpg',fmopenread); ms:=tmemorystream.create; gesendet:=0; fs.Position:=0; splitsize:=1024; while gesendet<fs.Size do begin copysize:=fs.Size-gesendet; if copysize>splitsize then copysize:=splitsize; ms.Clear; ms.CopyFrom(fs,copysize); gesendet:=gesendet+copysize; stream := TIdStreamVCL.Create(ms); idtcpclient1.Socket.WriteLn(inttostr(copysize)); idtcpclient1.Socket.WriteBufferOpen; idtcpclient1.Socket.Write(stream); idtcpclient1.Socket.WriteBufferclose; stream.destroy; end; end; Socket Error 10053 - Software caused connections abort weis einer was da oben dran falsch ist? bin totaler stream-einsteiger.. [edit] könnt auch sein, dass einfach ein logik-fehler drin ist.. wie gesagt bin stream-noob.. [/edit] danke! |
Re: Stream versenden mit Indy 10
kannste net bestimmen wieviel gewritet werden soll ? dann könntest ja per position und writecount angeben wo und wieviel im stream geschrieben werden soll. somit kannste deine pakete usw selbst realisieren
|
Re: Stream versenden mit Indy 10
aber mit dem umweg über nen memorystream, wie ichs gemacht hba, müsst doch normla gut gehn oder??
warum bekomm ich dan den drecksfehler? |
Re: Stream versenden mit Indy 10
ich hab zwar keine indy objekte benutzt aber das prinzip ist das gleiche.
schauts mal in den thread rein dort steht die antwort. ![]() im prinzip erstellt man einen puffer mit der packetgröße dann verschickt man das packet über den socket und wartet 100 ms - oder kürzer oder länger. Das beschränkt auch gleich die benutzte bandbreite (was ich eigentlich wollte). man dividiert also die stream length durch die packetgröße und läßt das in ner schleife durch den socket durch (sleep ist wichtig, weil sonst packete zusammengefasst werden). Am schluß wird geprüft ob alles durch ist, oder ob ein rest übrig bleibt und schickt noch den rest. Ich glaube ich hab das hier im forum schon mal besprochen. Ich hatte hald so ne idee und irgend ein netter mensch hier hat mir damals geholfen die streams zu zerlegen... Arnulf |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:16 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