Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Probleme mit Dateiempfang von TSockets (https://www.delphipraxis.net/85691-probleme-mit-dateiempfang-von-tsockets.html)

robinWie 3. Feb 2007 11:09


Probleme mit Dateiempfang von TSockets
 
Hallo,
ich habe im Internet was gefunden umd mit den TSocket Komponenten Dateien zu schicken. Alles funktioniert auch wunderbar, nur wenn der Server die Datei empfangen hat, kommt es mir so vor, als ob sie nicht abgeschlossen wird. Dabei handelt es sich um ein JPG Bild. Erst wenn dich die Anwendung schließe, kann ich das Bild angucken. Hier der Code beim Empfangen:
Delphi-Quellcode:
procedure TMainForm.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
 FST: TFileStream;
 LEN: integer;
 BUF: Pointer;
begin
  FST := TFileStream.Create(TMP, fmCreate or fmShareDenyWrite);
  LEN := Socket.ReceiveLength;
  GetMem(Buf, Len);
  try
    Socket.ReceiveBuf(Buf^, Len);
    FST.Write(Buf^, Len);
  finally
    FST := nil;
    FST.Free;
  end;
end;
TMP = 'C:\Windows\Temp\tmp.jpg'

Gibt es bei TFileStream noch eine Prozedure, die ich vergessen habe?

Danke im Voraus

Der_Unwissende 3. Feb 2007 11:54

Re: Probleme mit Dateiempfang von TSockets
 
Zitat:

Zitat von robinWie
ich habe im Internet was gefunden umd mit den TSocket Komponenten Dateien zu schicken.

Und offensichtlich falsch abgeschrieben :wink:

Zitat:

Zitat von robinWie
Hier der Code beim Empfangen:
Delphi-Quellcode:
  FST := TFileStream.Create(TMP, fmCreate or fmShareDenyWrite);
...
  finally
    FST := nil;
    FST.Free;
  end;

Das Problem liegt in deinem finally, tausche mal die beiden Zeilen oder lass FST := nil gleich weg. FST ist vom Typ TFileStream, hat also als Typ eine Klasse. Bei Objekten (Instanzen von Klassen) wird implizit mit Zeigern gearbeitet. Ohne dass Du etwas dafür/dagegen tun kannst wird in der Variablen FST also nur die Adresse des Objekts, dass Du mit FST := TFileStream.Create(..) erzeugst gespeichert.
Im finally-Block lässt Du FST dann erstmal auf die Adresse nil zeigen (wo bekanntlich nichts steht). Dein eigentliches Objekt (dass Du mit einer Sperre fmCreate or fmShareDenyWrite angelegt hast) befindet sich noch im Speicher. Mit dem FST.Free gibst Du ein Objekt an der Adresse nil frei, Free macht genau dann nichts (weil man eben nichts nicht freigeben kann).
Wichtig ist hier wirklich zu verstehen, dass FST nur der (implizite) Zeiger auf ein Objekt ist. Weißt Du FST einen anderen Wert zu, so änderst Du nur die Adresse auf die die Variable zeigt, nicht das Objekt hinter eben dieser Adresse.

Gruß Der Unwissende

robinWie 3. Feb 2007 11:59

Re: Probleme mit Dateiempfang von TSockets
 
Es funzt jetzt. Danke für deine Verständliche antwort, jetzt habe ich es verstanden.

Muetze1 4. Feb 2007 16:22

Re: Probleme mit Dateiempfang von TSockets
 
Diese Lösung funktioniert nur, wenn die Bilder entsprechend klein sind und die Verbindung entsprechend schnell. Der OnClientRead Event kann mehrfach aufgerufen werden, bis die Datei erfolgreich komplett empfangen wurde.

robinWie 4. Feb 2007 16:33

Re: Probleme mit Dateiempfang von TSockets
 
Du hast mir gerade die Lösung für ein anderes Problem verraten xD

Die Bilder haben eine Größe von 161x353 Pixeln und liegen im JPG Format vor. Dürfte also kein Problem sein. Zur sicherheit baue ich jetzt ein Sleep(1000) ein. Müsste reichen bei LAN...

Muetze1 4. Feb 2007 18:55

Re: Probleme mit Dateiempfang von TSockets
 
Ich würde es einfach richtig programmieren...

Vorschlag: Sende direkt einen Integer mit der Grösser der Daten die du sendest. Dann auf der Empfängerseite einfach so lange den FileStream offen halten und dort Daten reinschreiben, bis der Stream die ganz zu Anfang übertragene Grösse erreicht hat. Dann kannst auch den Stream schliessen, etc

robinWie 4. Feb 2007 19:39

Re: Probleme mit Dateiempfang von TSockets
 
so ich habe jetzt gaaaanz viel rumprobiert und komme nicht weiter. Hier findet ihr den Tip. Ich werde ihn nochmal durcharbeiten und die Anwendung neu schreiben :D. Vielleicht komme ich dann weiter. Aber heute habe ich keine Lust mehr...


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