Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Problem mit empfangen von Datei (https://www.delphipraxis.net/64414-problem-mit-empfangen-von-datei.html)

fran 3. Mär 2006 11:31


Problem mit empfangen von Datei
 
Hallo Leute,

ich habe da eine Frage und dachte vielleicht kann mir einer von euch Experten eventuell unter Umständen weiter helfen.

Ich programmiere im Moment an einer Client-Server-Anwendung, welche auch Dateien senden können soll.

Delphi-Quellcode:
var a : TMemoryStream;
   b: tfilestream;
begin
b:=TFileStream.Create(edit2.Text, fmopenread);
a:=TMemoryStream.Create;
a.LoadFromStream(b);
clientsocket1.Socket.SendBuf(a.Memory^, a.Size);
b.Free;
a.Free;
end;
Obenstehender Code ist der Sendeteil des Clients, wobei in edit2 der vollständige Pfad, der zu sendenden Datei steht.

Es hat den Anschein, als ob das senden auch soweit funktioniert, da beim Senden einer txt-Datei deren Inhalt im Memofeld des Servers ausgegeben werden kann.

Das Problem ist der Empfangsteil. Bis jetzt habe ich keine Möglichkeit gefunden wie das gehen könnte. Auch das Wälzen von Büchern und Googeln hat bisher keinen Erfolg gebracht.

Vielen Dank schon mal im voraus


Fran

Muetze1 3. Mär 2006 15:37

Re: Problem mit empfangen von Datei
 
1. Warum kein TMemoryStream.LoadFromFile() und sich den TFileStream sparen?
2. Wenn es eine grosse Datei wird, dann haut SendBuf() wahrscheinlich nicht mehr hin. Nutze die dafür eher geeignete Methode SendStream() des Sockets.
3. Was genau fehlt dir auf der Empfangsseite? Ein ReceiveBuf() bis zum kompletten Erhalt der Datei in den inkrementellen OnClientRead Aufrufen stellt doch an sich kein Problem da. Daher ist die Frage: wo liegt das Problem?

marabu 3. Mär 2006 15:42

Re: Problem mit empfangen von Datei
 
Hallo.

Ich würde eventuell den MemoryStream wegwerfen und mit FileStream und der Methode SendStream() arbeiten.

Grüße vom marabu

fran 3. Mär 2006 16:53

Re: Problem mit empfangen von Datei
 
Zitat:

Zitat von Muetze1
1. Warum kein TMemoryStream.LoadFromFile() und sich den TFileStream sparen?

Da bin ich leider nicht drauf gekommen.

Zitat:

2. Wenn es eine grosse Datei wird, dann haut SendBuf() wahrscheinlich nicht mehr hin. Nutze die dafür eher geeignete Methode SendStream() des Sockets.
Eigentlich sollen nur kleine Datei verschickt werden. Große verbrauchen zu viel Bandbreite. Kann man eigentlich die Größe der zu verschickenden Datei einschränken? Zum Beispiel das nur Datei bis zu einer Größe von 50 KB verschickt werden dürfen.

Zitat:

3. Was genau fehlt dir auf der Empfangsseite? Ein ReceiveBuf() bis zum kompletten Erhalt der Datei in den inkrementellen OnClientRead Aufrufen stellt doch an sich kein Problem da. Daher ist die Frage: wo liegt das Problem?
Das Problem liegt beim receivebuf. Leider habe ich aus den eingegangenen Dateidaten keine Datei auf der Festplatte erzeugen können.

SirThornberry 3. Mär 2006 16:57

Re: Problem mit empfangen von Datei
 
Die Datei auf der Empfängerseite musst du schon selbst anlegen und dann im receivebuf das was dort ankommt in deine geöffnete Datei schreiben (bzw. in deinen stream).

fran 7. Mär 2006 12:53

Re: Problem mit empfangen von Datei
 
Zitat:

Zitat von SirThornberry
Die Datei auf der Empfängerseite musst du schon selbst anlegen und dann im receivebuf das was dort ankommt in deine geöffnete Datei schreiben (bzw. in deinen stream).


Genau hier liegt ja das Problem. Die Daten vom recievebuf in die Datei zu bekommen.

marabu 7. Mär 2006 13:28

Re: Problem mit empfangen von Datei
 
Hallo fran,

kein unlösbares Problem. Du wirst ein eigenes Protokoll verwenden um dem Server mitzuteilen, dass er jetzt mit dem Upload einer Datei rechnen muss, wie groß die ist und auf welchen Namen sie hört. Daraufhin wirst du auf der Server-Seite dem entsprechenden Client einen FileStream zuordnen:

Delphi-Quellcode:
var
  fs: TFileStream;
  fn: TFileName;
begin
  // ...
  fs := TFileStream.Create(fn, fmCreate + fmShareDenyWrite);
end;
Im Ereignis OnClientRead wirst du den entsprechenden Stream ermitteln und die Daten entgegennehmen. Vom Prinzip her etwa so:

Delphi-Quellcode:
procedure TDemoForm.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  buf: array of Char;
  fs: TFileStream;
  i: Integer;
begin
  with Socket do
  begin
    // fs := GetClientFileStream(SocketHandle);
    SetLength(buf, ReceiveLength);
    ReceiveBuf(buf[0], ReceiveLength);
    fs.WriteBuffer(buf[0], ReceiveLength);
  end;
end;
Alles ungetestet.

Grüße vom marabu

fran 8. Mär 2006 17:20

Re: Problem mit empfangen von Datei
 
Das mit dem Senden und Empfangen funktioniert jetzt so wie es soll.

Ich habe da aber trotzdem noch eine Zusatzfrage:


Kann man das Senden auf Dateien einer bestimmten Größe beschränken? Also z.B. nur bis 100 KB oder so.

marabu 8. Mär 2006 17:24

Re: Problem mit empfangen von Datei
 
Warum nicht. In deinem Protokoll kannst du auf der Server-Seite die avisierte Dateigröße auswerten und eine entsprechend positive oder negative Rückmeldung an den Client senden.

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:39 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