Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi nach versenden mit indy datei unbrauchbar (https://www.delphipraxis.net/64589-nach-versenden-mit-indy-datei-unbrauchbar.html)

m0sch3r 5. Mär 2006 17:47


nach versenden mit indy datei unbrauchbar
 
Tach an alle, ich habe ein Problem

der download von Dateien mit indy Server und clinet, klappt super, die filegröße bleibt die selbe - ABER
die Datei ist unbrauchbar, die gif'S kann man nicht mehr angucken..!!

habe grade noch mal getestet mit mp3's, die Wiedergabe ruckelt, sie werden zwar abgespielt aber aber mit stottern..))) die Qualität ist nicht mehr die gleiche..!!

Hatte jemand das gleiche Problem...!?

Der_Unwissende 5. Mär 2006 18:07

Re: nach versenden mit indy datei unbrauchbar
 
HI,
also ehrlich gesagt ist deine Frage etwas ungenau formuliert. Ich habe jedenfalls keine Probleme mit Indy. Bleibt für dich eventuell die Frage, welche Delphi Version, welche Indy Version und welche Betriebssysteme ich damit schon am laufen hatte und vielleicht auch wie die Daten übertragen wurden, aber da sagst du ja auch nichts ;-)

Aber hab nicht in Erinnerung, schon häufiger etwas über von Indy verursachte Probleme beim Dateiversenden/empfangen gehört zu haben. Und bei Digitalen Musikdateien wie MP3s liegt der Qualitätsverlust sicher nicht am übertragen von Daten sondern am verändern eben dieser. Je nach Dateiformat kommen Interpreter unterschiedlich gut mit falschen Daten klar. Nimm dir am besten Testweise mal eine kleine Datei (z.B. einfacher Text), verschick die und vergleich die Empfangenen Daten mit denen die du gesendet hast. Bei gif oder ähnlichem bietet sich dann natürlich eher ein HexEditor an. Dort solltest du dann leicht sehen, ob die Daten auch die gleichen sind.

Gruß Der Unwissende

m0sch3r 5. Mär 2006 18:29

Re: nach versenden mit indy datei unbrauchbar
 
ich habe jetzt eine Sache herausgefunden.

die Satei wird stückweise übertragen

Server
Delphi-Quellcode:
 while (FileSize > 0) AND (not Fehler) do
                            begin
                            SendSize := FileSize;
                            if SendSize > PaketSize then SendSize := PaketSize;
                            FileSize := Filesize - SendSize;
                            try
                               Athread.Connection.OpenWriteBuffer;
                               Athread.Connection.WriteStream(FStream, false, true, SendSize);
                               Athread.Connection.CloseWriteBuffer;
                               //Updaten des Statusbars
                            except
                               fehler := true;
                               WriteByte(Athread, cZhopa);
                               break;
                            end; // try-except

                            end; // while
sendize ist in diesem Fall 20*1024

und wird empfangen von client auch stückweise in der gleichen Größe

Delphi-Quellcode:
 while (FileSize > 0) and (not fehler) do
                                  begin //20*1024
                                    if PaketSize > FileSize then PaketSize := FileSize;  //Wenn die DAtei kleiner ist als 20 kb
                                    try
                                       Fclient.ReadStream(FStream, PaketSize);
                                       FileSize := FileSize - PaketSize;
                                    //   Fstream.Position := FileSize;
                                    except
                                       fehler := true;
                                       WriteByte(cLogOut);
                                       Downloads.PSetStatusOfDownloadFile(cLogOut, Fclient);
                                       Fclient.Disconnect;
                                       Break;
                                    end; // except
                                   end; // while
wenn ich die Größe ändere von 20*1024 auf 1000*1024 verringert sich die Anzahl, der Aussetzer im lied sehr.

habe noch mal getestet mit word dokummenten, word kann sie nicht mehr öffnen...:(

wie kann man das erklären..!?

Der_Unwissende 5. Mär 2006 19:28

Re: nach versenden mit indy datei unbrauchbar
 
Nun ja, du benutzt wahrscheinlich ein Protokoll, das Paketbasiert ist (natürlich bei fast allen Protokollen für's Netz der Fall). Wie gesagt, verschick doch einfach mal eine Textdatei und schau dir an was ankommt.

Delphi-Quellcode:
  if FClient.ReadStream(FStream, PaketSize) <> PaketSize then
    begin
      // ups, Fehler.
    end;
Aber wichtiger ist, es handelt sich um ein Verbindungsloses Protokol. Du weißt nicht, wann die Datei komplett übertragen ist. Das Event, dass etwas ankommt wird wahrscheinlich mehrfach ausgelöst werden. Das heißt für dich, dass du wissen solltest welche Dateigröße du erwartest. Du hast zwar eine Kapselung, die dir den Transport abnimmt, aber du musst da schon ein wenig eigenes Protokoll mit implementieren.
Dazu sind zwei Dinge wichtig, du solltest alle Nachrichten die du verschickst mit einem Anfang und Ende kennzeichnen, damit du immer genau weißt wo deine Nachricht anfängt und wo sie endet (auch die kommen in Stückchen an). Damit verschickst du vorab die Nachricht, dass du eine Datei verschickst, die eine gewisse Größe hat (und gibst die Größe an). Nun wartest du am besten auf eine Bestätigung (dass die Datei erwartet wird). Dein Client wüßte dann wie groß die Datei sein soll, kann also in Ruhe warten bis die Datei vollständig übertragen wurde und erst dann alle Bytes übertragen.
Am einfachsten solltest du aber auch hier Anfang und Ende deiner Daten eindeutig kennzeichnen. Damit bist du sicher vor Fehlern. Dann suchst du als Startposition die Bytefolge, die deinen Datenanfang markiert und kopierst ab dieser Stelle. Natürlich kommt Word und co nicht mit defekten Headern zurecht, da können schon ein zwei falsche Bytes extreme Auswirkungen haben. Nimm zum Beispiel ein Tiff-File, die ersten zwei Bytes geben die Byteorder an, wenn die beschädigt ist, könntest du die zwar erraten, aber wäre keine gute Idee, oder?

m0sch3r 5. Mär 2006 19:58

Re: nach versenden mit indy datei unbrauchbar
 
Danke für die Antwort...))))
bin jetzt ein Stück weiter gekommen, und zwar, in jedem File was ich bekomme, sind die Ersten vier Byte defekt..!!!!

wenn ich beim Client, vor dem stream lesen die Vier Byte einlese sind die gedownloadeten Daten perfekt.
Das ist aber keine lösung des Problemms, ich habe mir die Server seite angeschaut, wo ich denn die vier Byte(int) zu falschen zeit sende. Habe keinen Fehler gefunden. Vieleicht findet ihn jemmand von euch...:)

Bin trotzdem für jeden Vorschlag dankbar..


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