AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Problem mit empfangen von Datei
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit empfangen von Datei

Ein Thema von fran · begonnen am 3. Mär 2006 · letzter Beitrag vom 8. Mär 2006
Antwort Antwort
fran

Registriert seit: 4. Nov 2005
38 Beiträge
 
Delphi 6 Personal
 
#1

Problem mit empfangen von Datei

  Alt 3. Mär 2006, 12:31
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Problem mit empfangen von Datei

  Alt 3. Mär 2006, 16:37
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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Problem mit empfangen von Datei

  Alt 3. Mär 2006, 16:42
Hallo.

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

Grüße vom marabu
  Mit Zitat antworten Zitat
fran

Registriert seit: 4. Nov 2005
38 Beiträge
 
Delphi 6 Personal
 
#4

Re: Problem mit empfangen von Datei

  Alt 3. Mär 2006, 17:53
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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Problem mit empfangen von Datei

  Alt 3. Mär 2006, 17:57
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).
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
fran

Registriert seit: 4. Nov 2005
38 Beiträge
 
Delphi 6 Personal
 
#6

Re: Problem mit empfangen von Datei

  Alt 7. Mär 2006, 13:53
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Problem mit empfangen von Datei

  Alt 7. Mär 2006, 14:28
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
  Mit Zitat antworten Zitat
fran

Registriert seit: 4. Nov 2005
38 Beiträge
 
Delphi 6 Personal
 
#8

Re: Problem mit empfangen von Datei

  Alt 8. Mär 2006, 18:20
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Problem mit empfangen von Datei

  Alt 8. Mär 2006, 18:24
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
  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 08: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