AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi (Indy) TCPClient bekommt zuviel vom Server
Thema durchsuchen
Ansicht
Themen-Optionen

(Indy) TCPClient bekommt zuviel vom Server

Ein Thema von Harry M. · begonnen am 20. Apr 2006 · letzter Beitrag vom 21. Apr 2006
 
Benutzerbild von Harry M.
Harry M.

Registriert seit: 29. Okt 2004
Ort: Halle
462 Beiträge
 
#1

(Indy) TCPClient bekommt zuviel vom Server

  Alt 20. Apr 2006, 18:08
Mahlzeit!

Ich möchte mit einem Indy TCPClient von einem Indy TCPServer eine Datei holen (was auch sonst ) Der Server sendet dabei (im Debugg-Modus) einen 2048 Byte grossen Stream an den Client dieser empfängt aber gleich mehr als die ganz Datei

Der Client;
Delphi-Quellcode:
procedure TDownloadThread.DownloadFile;
begin
  TCPClient := TIdTCPClient.Create(nil);
  TCPClient.Host := sHost;
  TCPClient.Port := iPort;

  try
    TCPClient.Connect(-1);
    except end;

  if TCPClient.Connected then begin
    TCPClient.WriteLn('GETSIZE='+sFileName);

    iRemoteFileSize := StrToInt(TCPClient.ReadLn);

    if iRemoteFileSize > 0 then begin
      TCPClient.WriteLn('GETFILE='+sFileName);

      fs := TFileStream.Create(sFileName + '.copy' ,fmCreate);
      ms := TMemoryStream.Create;

      sStatus := StatusWork;
      sProgress := IntToStr( Round(fs.Size/iRemoteFileSize*100) ) + '%';
      Synchronize(SyncProgress);

      while (TCPClient.Connected) and (fs.Size < iRemoteFileSize) do begin
       ms.Clear;

       try
        TCPClient.ReadStream(ms); // hier sollte er immer nur 2048 bzw den Rest bekommen, tut er aber nicht :-(
        except end;

        if ms.Size > 0 then
          fs.CopyFrom(ms, 0);

        sProgress := IntToStr( Round(fs.Size/iRemoteFileSize*100) ) + '%';
        Synchronize(SyncProgress);
        end;

      FreeAndNil(fs);
      FreeAndNil(ms);
      end;

    end;

  sStatus := StatusDone;
  Synchronize(SyncProgress);
  TCPClient.Free;
end;
Der Server, welcher meiner Meinug nach läuft:
Delphi-Quellcode:
procedure TVPumper.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  fs: TFileStream;
  ms: TMemoryStream;
  I: Integer;
  iBytes2Send: Cardinal;
  S, sCommand, sFileName, sHash: String;
  slFileList: TStringList;
begin
  S := UpperCase(AThread.Connection.ReadLn);

  slFileList := TStringList.Create;

  sCommand := Copy(S, 1, 7);
  sFileName := Copy(S, 9, Length(S));

  // Dateiliste erstellen
  if sCommand = 'GETLISTthen begin
    if CreateFileList(ShreadFolder + '*.*', sFileName, slFileList) then
      slFileList.Text := StringReplace(slFileList.Text, '', '', [rfReplaceAll]);
      AThread.Connection.WriteLn(slFileList.Text);
      AThread.Connection.Disconnect;
    end;
                       
  if sCommand = 'GETSIZEthen begin

    sHash := Copy(S, 9, Length(S));

    if CreateFileList(ShreadFolder + '*.*', sHash, slFileList) then begin
      I := Pos('|', slFileList.Text) + 1;
      slFileList.Text := Copy(slFileList.Text, I, Length(slFileList.Text));

      I := Pos('|', slFileList.Text) - 1;
      slFileList.Text := Copy(slFileList.Text, 1, I);

      AThread.Connection.WriteLn(slFileList.Text);
      //AThread.Connection.Disconnect;
      end;

    end;

  if sCommand = 'GETFILEthen begin
    sHash := Copy(S, 9, Length(S));
    sFileName := Hash2File(sHash);

    fs := TFileStream.Create(sFileName ,fmOpenRead   + fmShareDenyNone);
    ms := TMemoryStream.Create;

    while fs.Position < fs.Size do begin
      ms.Clear;

      iBytes2Send := fs.Size - fs.Position;

      if iBytes2Send > 2048 then
        iBytes2Send := 2048;

      ms.CopyFrom(fs, iBytes2Send);

      AThread.Connection.OpenWriteBuffer;
      AThread.Connection.WriteStream(ms, True, True); // immer fleißig 2048 schauffeln, bzw den Rest
      AThread.Connection.CloseWriteBuffer;

      end;

    AThread.Connection.Disconnect;
    FreeAndNil(fs);
    FreeAndNil(ms);
    end;

  slFileList.Free;
end;
Wo liegt der Fehler (ausser im Detail ) ?
Harry
Gruß Harry
www.H-Soft.info
  Mit Zitat antworten Zitat
 


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 06:59 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