AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Probleme mit Dateiempfang von TSockets
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit Dateiempfang von TSockets

Ein Thema von robinWie · begonnen am 3. Feb 2007 · letzter Beitrag vom 4. Feb 2007
Antwort Antwort
Benutzerbild von robinWie
robinWie

Registriert seit: 26. Okt 2005
Ort: Lippcity
404 Beiträge
 
Delphi 2005 Personal
 
#1

Probleme mit Dateiempfang von TSockets

  Alt 3. Feb 2007, 11:09
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
Robin W.
Ein Computer kann (fast) alles.... Man muss es ihm nur beibringen
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Probleme mit Dateiempfang von TSockets

  Alt 3. Feb 2007, 11:54
Zitat von robinWie:
ich habe im Internet was gefunden umd mit den TSocket Komponenten Dateien zu schicken.
Und offensichtlich falsch abgeschrieben

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
  Mit Zitat antworten Zitat
Benutzerbild von robinWie
robinWie

Registriert seit: 26. Okt 2005
Ort: Lippcity
404 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Probleme mit Dateiempfang von TSockets

  Alt 3. Feb 2007, 11:59
Es funzt jetzt. Danke für deine Verständliche antwort, jetzt habe ich es verstanden.
Robin W.
Ein Computer kann (fast) alles.... Man muss es ihm nur beibringen
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Probleme mit Dateiempfang von TSockets

  Alt 4. Feb 2007, 16:22
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.
  Mit Zitat antworten Zitat
Benutzerbild von robinWie
robinWie

Registriert seit: 26. Okt 2005
Ort: Lippcity
404 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Probleme mit Dateiempfang von TSockets

  Alt 4. Feb 2007, 16:33
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...
Robin W.
Ein Computer kann (fast) alles.... Man muss es ihm nur beibringen
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Probleme mit Dateiempfang von TSockets

  Alt 4. Feb 2007, 18:55
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
  Mit Zitat antworten Zitat
Benutzerbild von robinWie
robinWie

Registriert seit: 26. Okt 2005
Ort: Lippcity
404 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Probleme mit Dateiempfang von TSockets

  Alt 4. Feb 2007, 19:39
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 . Vielleicht komme ich dann weiter. Aber heute habe ich keine Lust mehr...
Robin W.
Ein Computer kann (fast) alles.... Man muss es ihm nur beibringen
  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 16:54 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