AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi idTCPClient und idTCPServer
Thema durchsuchen
Ansicht
Themen-Optionen

idTCPClient und idTCPServer

Ein Thema von hyype · begonnen am 26. Nov 2008 · letzter Beitrag vom 26. Nov 2008
Antwort Antwort
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#1

idTCPClient und idTCPServer

  Alt 26. Nov 2008, 10:52
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!!
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

Re: idTCPClient und idTCPServer

  Alt 26. Nov 2008, 11:43
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!?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#3

Re: idTCPClient und idTCPServer

  Alt 26. Nov 2008, 11:54
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.
  Mit Zitat antworten Zitat
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#4

Re: idTCPClient und idTCPServer

  Alt 26. Nov 2008, 12:38
ConnectTimeout und ReadTimeout von den Standardwerten auf 1000 zu ändern, hat beide Probleme gelöst;
  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 10:32 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