Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi idTCPClient und idTCPServer (https://www.delphipraxis.net/124847-idtcpclient-und-idtcpserver.html)

hyype 26. Nov 2008 09:52


idTCPClient und idTCPServer
 
So, ich habe jetzt mal einen neuen Thread aufgemacht, weil der alte thematisch nicht mehr wirklich dazu passt:
Ich verschicke eine Datei von der Client zur Server Komponente.
Folgende Probleme treten dabei auf:

1.) Wenn die Komponenten auf/in unterschiedlichen Forms/Units, aber in der gleichen Anwendung sind UND die Datei größer als 1 Packet ist, hängt er sich weg. Dies war gestern noch nicht so und ich habe nichts geändert - Wieso ist das so?

2.) Ich habe die Client-Komponente in eine 2. Anwendung ausgelagert und verschicke besagte Datei nun 10 mal. Dies habe ich gemacht, um zu sehen, ob die indys automatisch für jede eingehende Clientverbindung einen Thread erstellen. Und es scheint so zu sein, ABER:
Von den 10 "Versuchen", speichert er die Datei manchmal 3 mal, manchmal 4 mal, manchmal 6 mal und manchmal 8 mal (das waren die 4 Fälle, die bisher aufgetreten sind), statt genau 10 mal - Wieso ist das so?

hier mal der Code:
-Versenden:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  ms:TMemoryStream;
  strFolder:string;
  strFileName:string;
begin
  strFolder:='H:\Src\';
  strFileName:='test.pdf';
  ms:=TMemoryStream.create;
  ms.LoadFromFile(strFolder+strFileName);
  try
    if not idtcpclient1.Connected then
      idtcpclient1.Connect;
    try
      idtcpclient1.Socket.write(ms,0,true); //hier bleibt er stehen
    finally
      idtcpclient1.Disconnect;
    end;
    ms.Free;
  except
    memo1.Lines.Add('fehler bei indy-client');
  end;
end;
-Empfangen:
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  ms: TMemoryStream;
  SizeOfIncomingStream: Integer;
  strFolder:string;
  strFileName:string;
begin
  memo1.Lines.Add('es kommt was');
  try
    strFolder:='H:\Ziel\';
    strFileName:='test.pdf';
    ms := TMemoryStream.Create;
    with AContext.connection do
    begin
      try
        SizeOfIncomingStream := Socket.ReadInteger;
        Socket.ReadStream(ms, SizeOfIncomingStream);
      finally
        Disconnect;
      end;
    end;
  except
    memo1.Lines.Add('fehler bei indy-server');
  end;
  ms.SaveToFile(uniquefilename(strfolder+strfilename));
  ms.Free;
end;
Beim 10-fachen Versenden habe ich einfach ne Integer-Variable erstellt, die von 1 bis 10 hochläuft.
Vielen Dank für Eure Mithilfe!!

s.h.a.r.k 26. Nov 2008 10:43

Re: idTCPClient und idTCPServer
 
dir ist schon klar, dass du beim verschicken immer die gleiche datei überschreibst!? vielleicht liegt es nicht an den indys - wovon ich ausgehe - sondern eher daran, dass kein zugriff auf die datei möglich ist. ich würde das mal testen und die ankommenden dateien jeweils in eigene dateien schreiben. was passiert dann!?

hyype 26. Nov 2008 10:54

Re: idTCPClient und idTCPServer
 
ich bin vlei ein noob, aber ganz blöde och nich ^^
Delphi-Quellcode:
function split(s:string; delimiter:string; part:integer):string;
var
  i:integer;
begin
  result:=s;
  try
    if length(s)>2 then
    begin
      i:=1;
      while (s[i]<>delimiter) and (i<length(s)) do
        i:=i+1;
      if (i<length(s)) and (i>1) then
        if part=1 then
          result:=copy(s,1,i-1)
        else
          if part=2 then
            result:=copy(s, i+1,length(s)-i);
    end;
  except
    on e : exception do
      form1.memo1.lines.add('error in split-function  '+e.message);
  end;
end;

function UniqueFileName(s:string):string;
var
  i:integer;
  part1, part2:string;
begin
  result:=s;
  try
    if fileexists(s) then
    begin
      part2:=reversestring(split(reversestring(s),'.',1));
      part1:=reversestring(split(reversestring(s),'.',2));
      i:=1;
      while fileexists(part1+'('+inttostr(i)+').'+part2) do
        i:=i+1;
      result:=part1+'('+inttostr(i)+').'+part2;
    end;
  except
    on e : exception do
      form1.Memo1.Lines.Add('error in function uniquefilename  '+e.message);
  end;
end;
Es müssten die Dateien
test.pdf
test(1).pdf
.
.
.
test(9).pdf
entstehen.
Es entstehen aber nicht 10, sondern weniger (immer unterschiedlich viele) Dateien. Spannend ist auch, dass er eben 5 mal ins memo geschrieben hat, dass was kommt, aber nur 3 Dateien entstanden sind.

hyype 26. Nov 2008 11:38

Re: idTCPClient und idTCPServer
 
ConnectTimeout und ReadTimeout von den Standardwerten auf 1000 zu ändern, hat beide Probleme gelöst;


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