AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Stream versenden mit Indy 10
Thema durchsuchen
Ansicht
Themen-Optionen

Stream versenden mit Indy 10

Ein Thema von HenryX14 · begonnen am 7. Feb 2005 · letzter Beitrag vom 10. Mai 2005
Antwort Antwort
HenryX14

Registriert seit: 12. Mär 2003
19 Beiträge
 
#1

Stream versenden mit Indy 10

  Alt 7. Feb 2005, 13:25
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. Was soll das und wie kann ich jetzt einen normalen stream versenden? Hat TIdStreamVCL irgendeinen vorteil?

Bin für jede Antwort sehr dankbar!

Henry
  Mit Zitat antworten Zitat
HenryX14

Registriert seit: 12. Mär 2003
19 Beiträge
 
#2

Re: Stream versenden mit Indy 10

  Alt 10. Feb 2005, 18:59
Hallo Leute,

Indy 10 scheint wahrscheinlich noch nicht so sehr vertreten zu sein..
Also ich habe mittlerweile einen Filetransfer zustande bekommen. (unten seht ihr den Code)
Das funktioniert, so wie er da steht. Ich bin damit aber irgendwie nicht ganz zufrieden, denn:
- 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:
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;
Server:
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;
  Mit Zitat antworten Zitat
Benutzerbild von mr47
mr47

Registriert seit: 6. Dez 2004
Ort: Stuttgart
644 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Stream versenden mit Indy 10

  Alt 10. Feb 2005, 19:40
Auch die Zeit löst manche probleme
  Mit Zitat antworten Zitat
HenryX14

Registriert seit: 12. Mär 2003
19 Beiträge
 
#4

Re: Stream versenden mit Indy 10

  Alt 10. Feb 2005, 19:46
Zitat von mr47:
Auch die Zeit löst manche probleme
Das stimmt. Aber leider nur manche. Für die, die sich nicht "von alleine" lösen gibt es immer wieder nette Leute, die einem weiterhelfen.

Also, bei der Paketproblematik (siehe oben) bin ich leider immer noch nicht weitergekommen.

Henry
  Mit Zitat antworten Zitat
HenryX14

Registriert seit: 12. Mär 2003
19 Beiträge
 
#5

Re: Stream versenden mit Indy 10

  Alt 11. Feb 2005, 18:43
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
  Mit Zitat antworten Zitat
prinz_inzide

Registriert seit: 24. Jan 2005
64 Beiträge
 
#6

Re: Stream versenden mit Indy 10

  Alt 6. Mai 2005, 22:41
hab genau das selbe problem..

habs so VERSUCHT zu lösen (geht leider net)..

Delphi-Quellcode:
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;
aber es kommt immer der fehler:
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!
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Stream versenden mit Indy 10

  Alt 6. Mai 2005, 23:30
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
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
prinz_inzide

Registriert seit: 24. Jan 2005
64 Beiträge
 
#8

Re: Stream versenden mit Indy 10

  Alt 7. Mai 2005, 10:31
aber mit dem umweg über nen memorystream, wie ichs gemacht hba, müsst doch normla gut gehn oder??
warum bekomm ich dan den drecksfehler?
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#9

Re: Stream versenden mit Indy 10

  Alt 10. Mai 2005, 14:58
ich hab zwar keine indy objekte benutzt aber das prinzip ist das gleiche.

schauts mal in den thread rein dort steht die antwort.
stream oder file versenden

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
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:57 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