AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke TIdTCPServer & TIdTCPClient - Verschiedene Fragen

TIdTCPServer & TIdTCPClient - Verschiedene Fragen

Ein Thema von RWarnecke · begonnen am 20. Aug 2010 · letzter Beitrag vom 18. Nov 2021
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

TIdTCPServer & TIdTCPClient - Verschiedene Fragen

  Alt 20. Aug 2010, 11:34
Hallo zusammen,

beim TIdTCPServer und TIdTCPClient kann ich ja mit dem Befehl Writeln Zeichenketten an den Client oder Server übetragen. Mit Readln kann ich dann an der Gegenstelle die übermittelten Zeichenketten auslesen. Jetzt zu meinen Fragen, vielleicht kann mir der eine oder andere Erfahrungswerte dazu nennen :

Wie hoch die maximale Clientzahl ist, die ich an einen TIdTCPServer connecten kann ?
Wie läuft die Verarbeitung ab, kann ich mir das so Vorstellen wie in einem Spooler ?
Wenn ich mit einem TIdTCPClient per Writeln mehrere Zeichenketten übertrage an den Server, werden alle nacheinander abgearbeitet oder kann mir dann ein zweiter Client dazwischen funken ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#2

AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen

  Alt 23. Aug 2010, 07:22
*push* Hat hier wirklich keiner Erfahrungen mit ? *push*
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
533 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen

  Alt 23. Aug 2010, 08:04
Meine Antworten beziehen sich nicht auf Indy.
Wir arbeiten mit ICS und Synapse.
Aber da wird diesbezüglich nicht viel anders sein.

Hallo zusammen,
Wie hoch die maximale Clientzahl ist, die ich an einen TIdTCPServer connecten kann ?
?
Ist vermutlich nur durch die Bandbreite und die Server Performance begrenzt.
Wir haben Server mit > 1000 Clients. Probiers doch aus.

Hallo zusammen,
Wie läuft die Verarbeitung ab, kann ich mir das so Vorstellen wie in einem Spooler ?
?
Nein. Bei den oben beschriebenen Sockets kommen die Pakete in einem Event an welcher nicht im Hauptthread läuft.
Die Pakete haben eine Client Identifikation. Das zusammensetzen musst Du natürlich mit Hilfe (D-)eines Protokolls machen.

Hallo zusammen,
Wenn ich mit einem TIdTCPClient per Writeln mehrere Zeichenketten übertrage an den Server, werden alle nacheinander abgearbeitet oder kann mir dann ein zweiter Client dazwischen funken
?
Wie oben beschrieben kommen in dem Event Pakete von verschiedenen Clients gemischt mit verschiedenen Grössen an.
Das ist aber alles halb so wild wenn Du Dich mal ein bisschen mit dem beschäftigst.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#4

AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen

  Alt 23. Aug 2010, 08:41
Beim TIdTCPServer wird für jeden Client ein Thread eröffnet.

>Wie hoch ist die maximale Clientzahl, die ich an einen TIdTCPServer connecten kann ?
Die Threadanzahl wird durch den Speicher begrenzt. Da pro Thread mind 1MB Speicher angefordert wird, ist also spätestens bei 2048 Clients Schluss. Ich habe nicht untersucht, ob durch Änderung von Parametern die Größe des angeforderten Speichers geändert werden kann. Windows begrenzt die maximal Anzahl der TCP-Verbindungen ebenfalls. Allerdings habe ich bisher keine belastbaren Zahlen darüber gefunden, wie groß diese Zahl denn nun ist. Viele Dokumente stammen aus NT-Zeiten, diverse Parameter haben augenscheinlich heute keinen Relevanz mehr usw. Nach meinen persönlichen Erfahrungen scheint diese Zahl bei einer normalen Arbeitsstation (also nicht Server) auch bei ca. 2000 Verbindungen zu liegen. Dazu kommt dann noch, dass eine freigegebene Verbindung nicht sofort wieder belegt werden kann. Wenn sich also 2000 Clients verbinden, sofort wieder trennen und sich dann die nächsten 2000 Clients verbinden wollen, dann wird das nicht funktionieren, weil die 2000 alten Verbindungen erst nach 3 Minuten wirklich freigegeben werden (dazu gibt es irgendwo eine readme von Borland zum Interbase-Server)

>Wie läuft die Verarbeitung ab, kann ich mir das so Vorstellen wie in einem Spooler ?
Die angeschlossenen Clients werden quasiparallel abgearbeitet. Die Zeichenketten für jede einzelne Verbindung sind aber streng seriell.

>Wenn ich mit einem TIdTCPClient per Writeln mehrere Zeichenketten übertrage an den Server, werden alle nacheinander abgearbeitet oder kann mir dann ein zweiter Client dazwischen funken ?
Der Server zerlegt die ankommenden Zeichenketten, indem er nach dem Zeilenende sucht. Für Dich sieht es also so aus, als ob die Zeilen einzeln ankommen würden. Die Zeichenketten unterschiedlicher Clients können sich nicht mischen. (Tip: Falls die kleine Verzögerung bei der Übertragung einzelner kurzer Kommandos störend ist: s.a. Stichwort "UseNagle" bzw. "TCP_NoDelay")
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen

  Alt 23. Aug 2010, 08:57
Zitat:
Beim TIdTCPServer wird für jeden Client ein Thread eröffnet.
Das ist nur bei Indy9 richtig !!!!!

Bei Indy10 wird über sogenannte Scheduler eine Art Threadpool realisiert,
aus dem sich die einzelnen Clients bedienen.

Somit ist das beschriebene Limit nicht vorhanden, ich selber habe einen Server(mit Indy10 readlisiert)
an dem im Schnitt permanent 1000-2000 Clients connected sind, bisherige Spitze knapp über 5000 Clients.
Habe aber keine Ahnung ob es eine Limit gibt und wodurch es definiert wird!

Greetz Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Win32.API

Registriert seit: 23. Mai 2005
312 Beiträge
 
#6

AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen

  Alt 23. Aug 2010, 09:14
Das ist nur bei Indy9 richtig !!!!!

Bei Indy10 wird über sogenannte Scheduler eine Art Threadpool realisiert,
aus dem sich die einzelnen Clients bedienen.
Dem kann ich so nicht zustimmen. Assertor hat sich damals bei den entsprechenden Entwicklern erkundigt und diese haben bestätigt, dass Indy keine Threadpools unterstützt. Siehe hier.

Wenn Du andere/neuere Informationen hast, eventuell sogar ein Beispiel, wäre ich Dir sehr dankbar.

-Win32
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen

  Alt 23. Aug 2010, 09:31
@Win32.Api:

Den von Dir verlinkten Thread hatte ich leider noch nicht gelesen!
Wenn Assertor das so sagt wird es definitiv stimmen, ich bin bisher davon ausgegangen
das die Scheduler wirklich ein Thread-Management über einen Thread-Pool realisieren.
Dann denke ich war mein Server mit > 5000 Clients schon hart an der Grenze(vermute ich mal),
allerdings sind die connecteten Clients selten aktiv und schlafen die meiste Zeit.
Aber danke nochmal für die Aufklärung!

Greetz Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Win32.API

Registriert seit: 23. Mai 2005
312 Beiträge
 
#8

AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen

  Alt 23. Aug 2010, 10:40
Die Threadanzahl wird durch den Speicher begrenzt. Da pro Thread mind 1MB Speicher angefordert wird, ist also spätestens bei 2048 Clients Schluss. Ich habe nicht untersucht, ob durch Änderung von Parametern die Größe des angeforderten Speichers geändert werden kann.
Die von Indy erstellten Threads haben keine 1MB StackSize, deshalb ist der Speicher hier nicht limitierend (1500 Threads vs ~80MB).

Hier mal ein Beispiel:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  Windows, Sysutils, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer,
  IdContext, IdTCPConnection, IdTCPClient;

type
  TTestServer = class(TIdTCPServer)
  private
    procedure MyOnExecute(AContext: TIdContext);
  public
    constructor Create;
  end;

{ TTestServer }

constructor TTestServer.Create;
begin
  inherited Create(nil);
  with (Bindings.Add) do
    Port := 5000;
  OnExecute := MyOnExecute;
  Active := True;
end;

procedure TTestServer.MyOnExecute(AContext: TIdContext);
begin
  Sleep(1000);
end;

var
  Server: TTestServer;
  Client: TIDTCPClient;
  i: Integer;
begin
  Server := TTestServer.Create();

  try
    for i := 1 to 10000 do
    begin
      Client := TIdTCPClient.Create(nil);
      Client.Connect('localhost', 5000);
      writeln(i);
    end;
  except
    on e: Exception do
      writeln(Format('%s::%s', [E.ClassName, E.Message]));
  end;

  writeln('Client Version: ', Client.Version);
  writeln('Server Version: ', Server.Version);
  readln;
end.
Auf diesem Rechner hier (Win7 64bit, Dualcore, 4GB RAM) ist nach 1546 Connects Schluss (Connection refued #10061). Würde mich freuen, wenn Ihr diesen Test mal bei euch ausführt und die Ergebnisse Postet. (Achtung: Bitte nicht mit Debugger ausführen, da Delphi sonst streikt!)

Connects: 1546
Client/Server Version: 10.5.5

In diesem Fall scheint Windows zu limitieren, wahrscheinlich die Max Anzahl von TCP-Connections.

-Win32
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen

  Alt 23. Aug 2010, 11:21
Würde mich freuen, wenn Ihr diesen Test mal bei euch ausführt und die Ergebnisse Postet.
Windows 7 32Bit
AMD Phenom II X4 @ 3000
4GB Arbeitsspeicher
RAD Studio 2007 Prof.

Verbindungen 1995 (im Schnitt +/-2)
ClientVersion 10.1.5
ServerVersion 10.1.5

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen

  Alt 23. Aug 2010, 15:50
Hi,

bei meiner Config auf meiner Workstation im Office :

Windows Vista Business(32 Bit)
Intel Core Duo CPU 8400 2 x 3.0 GHz
4 GB Ram

Verbindungen: 1989
EIdSocketError::Socket Error # 10061 Connection refused.
Client Version: 10.1.5
Server Version: 10.1.5

Speicherauslastung dabei 41,9 MB.

Werde das heute Abend nochmal auf einem richtigen Windows Server System testen,
ich denke nämlich es wird hier irgenteine Workstation beschränkung zuschlagen.

Greetz Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 04:03 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