![]() |
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:
Obenstehender Code ist der Sendeteil des Clients, wobei in edit2 der vollständige Pfad, der zu sendenden Datei steht.
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; 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 |
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? |
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 |
Re: Problem mit empfangen von Datei
Zitat:
Zitat:
Zitat:
|
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).
|
Re: Problem mit empfangen von Datei
Zitat:
Genau hier liegt ja das Problem. Die Daten vom recievebuf in die Datei zu bekommen. |
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:
Im Ereignis OnClientRead wirst du den entsprechenden Stream ermitteln und die Daten entgegennehmen. Vom Prinzip her etwa so:
var
fs: TFileStream; fn: TFileName; begin // ... fs := TFileStream.Create(fn, fmCreate + fmShareDenyWrite); end;
Delphi-Quellcode:
Alles ungetestet.
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; Grüße vom marabu |
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. |
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 21:22 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