Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Dateien Kommen nur teilweise an! (https://www.delphipraxis.net/111818-dateien-kommen-nur-teilweise.html)

Dr0mFr34K 9. Apr 2008 21:32


Dateien Kommen nur teilweise an!
 
Hey Leute!

Habe da nen Problem hab eine kleine CLient - Server Applikation geschreiben, um auf meinen PC auf arbeit von Zuhause zugreifen kann. Ich wollte soeben eine FUnktion einbauen um Dateien zusenden. Die Verzeichnisse anzeigen kann ich , nur wenn ich die datei sozusagen downloaden will hab ich dann eine Datei auf dem PC die nur immero so 1,4 kb groß ist..hier mal der COde zu den Funktionen:
Ach noch zu erwänen ist dass ich von CLient zu Server connecte also der CLient ist auf Arbeit und der Server bei mir..also eine Art wie heißt das ..ich glaube Reverse oder so, damit ich meinen DynDns nutzen kann..so jetzt aber der COde!

Client
Delphi-Quellcode:
procedure TForm1.VerifyDataReceived(Data: string; Socket: TCustomWinSocket);
var
  COMMAND,TMP_COMMAND, l, rc: Integer;
  tmpAnswer, user, version:string;
  Reg: TRegistry;
  label Finish;
begin
  COMMAND:=StrToIntDef(Copy(Data,1,3),-1);
  if COMMAND < 0 then
  begin
    Exit;
  end;
  TMP_COMMAND := -1;
  Data := Copy(Data,4,Length(Data));
  if COMMAND = COMMAND_FILE then
  begin
    TMP_COMMAND := COMMAND_FILE;
    tmpAnswer:=GetFile(Data);
    goto Finish;
  end else

--------------------------- Get FIle function

function TForm1.GetFile(const PathName: string): string;
var
   fs : TFileStream;
begin
   fs := TFileStream.Create(PathName, fmOpenRead or fmShareDenyWrite);
   SetLength(Result, fs.Size);
   fs.Read(Result[1], fs.Size);
   fs.Free;
end;

--------------------------- Sende Methode (also damit werden die daten an server gesendet)
procedure TForm1.SendAnswer(COMMAND: Integer; strAnswer: string; Socket: TCustomWinSocket);
begin
   try
      Socket.SendText(FormatFloat('00#',COMMAND) + strAnswer);
   except
      Socket.Close;
   end;
end;
Server
Delphi-Quellcode:
procedure TMainForm.VerifyData(Data: string);
var
   COMMAND:integer;
begin
  COMMAND := StrToIntDef(Copy(Data,1,3),-1);
  if COMMAND < 0 then Exit;
  Data := Copy(Data,4,Length(Data));
  if COMMAND = COMMAND_FILE then
  begin
      Assert(FileForm <> nil);
      (FileForm as TFilesForm).SetFileData(Data);
    Exit;
    end;

-------------------------------- Send Methode zu CLient
procedure TMainForm.SendCommand(COMMAND: Integer; Args: string);
begin
  if ConnectionsListBox.itemindex <> -1 then
  begin
    if ServerSocket1.Active then
    try
      ConnectionID := ConnectionsListBox.Itemindex;
      ServerSocket1.Socket.Connections[ConnectionID].SendText(FormatFloat('00#',COMMAND) + Args);
    except
    end else LogMemo.Lines.add('You''re not connected...');
  end else showmessage('You must first select a client to send the command to');
end;
Vielleicht könnt ihr mir ja helfen wäre echt super!

Bis später!

Mfg Dr0mFr34K

SirThornberry 9. Apr 2008 21:37

Re: Dateien Kommen nur teilweise an!
 
Der relevante Teil fehlt. Ich denke mal du bist bisher davon ausgegangen das in den Events von TServerSocket und TClientSocket jeweils die ganze Datei ankommt. Letztendlich ist es aber so das die Datei in mehreren Stücken/Packeten ankommt und dafür jedes mal das Ereignis aufgerufen wird.

Dr0mFr34K 9. Apr 2008 21:41

Re: Dateien Kommen nur teilweise an!
 
hmmmm also meinst du muss das in ne schleife damit der die anderen teile/ packete überträgt bis es fertig is?

SirThornberry 9. Apr 2008 21:43

Re: Dateien Kommen nur teilweise an!
 
keine Schleife. Du musst dir einfach ein Protokoll ausdenken damit du weißt wann das letzte packet angekommen ist. Oder du schickst zuerst die Größe der Datei und schreibst dann so lange alle kommenden Daten in die Datei bis die Größe erreicht ist (das wäre die einfachste Variante)

Dr0mFr34K 9. Apr 2008 21:45

Re: Dateien Kommen nur teilweise an!
 
ach..ja ok so meinst du das na mal schaun wie ich das mach ..danke schonmal

Dr0mFr34K 10. Apr 2008 18:05

Re: Dateien Kommen nur teilweise an!
 
Sorry for doppelpost aber hatte oben noch was vergessen und zwar den empfang von der datei im server

das geschieht hiermit

Delphi-Quellcode:
procedure TFilesForm.SetFileData(const FileData: string);
var
   fs : TFileStream;
begin
   SaveDialog1.FileName := CurFile;
   if SaveDialog1.Execute then begin
      fs := TFileStream.Create(SaveDialog1.FileName, fmCreate);
      fs.Write(FileData[1], Length(FileData));
      fs.Free;
   end;
end;


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