![]() |
TIdTCPServer & TIdTCPClient - Verschiedene Fragen
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 ? |
AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen
*push* Hat hier wirklich keiner Erfahrungen mit ? *push*
|
AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen
Meine Antworten beziehen sich nicht auf Indy.
Wir arbeiten mit ICS und Synapse. Aber da wird diesbezüglich nicht viel anders sein. Zitat:
Wir haben Server mit > 1000 Clients. Probiers doch aus. Zitat:
Die Pakete haben eine Client Identifikation. Das zusammensetzen musst Du natürlich mit Hilfe (D-)eines Protokolls machen. Zitat:
Das ist aber alles halb so wild wenn Du Dich mal ein bisschen mit dem beschäftigst. |
AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen
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") |
AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen
Zitat:
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 |
AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen
Zitat:
![]() Wenn Du andere/neuere Informationen hast, eventuell sogar ein Beispiel, wäre ich Dir sehr dankbar. -Win32 |
AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen
@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 |
AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen
Zitat:
Hier mal ein Beispiel:
Delphi-Quellcode:
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!)
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. Connects: 1546 Client/Server Version: 10.5.5 In diesem Fall scheint Windows zu limitieren, wahrscheinlich die Max Anzahl von TCP-Connections. -Win32 |
AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen
Zitat:
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 |
AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen
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 |
AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen
1)
Windows XP Professional (32Bit) Intel Core2Duo E6600 2 GB RAM Zitat:
2) Windows Server 2003 Web Edition (32Bit) Intel Core2Duo E6600 2 GB RAM Zitat:
|
AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen
Hallo zusammen,
wow, soviele Informationen. Da muss ich mich erstmal durchwurschteln. Aber ich danke schon mal allen im voraus für Ihre Antworten. Bei meinem Rechner mit Windows 7 64Bit 8GB RAM gab es 1578 Verbindungen. Bei meinem Server 2008 32Bit 1GB RAM gab es zwischen 1999 und 2020 Verbindungen. Beim 2. Server 2008 32Bit mit 2GB RAM um die 2000 Verbindungen +/- 5 Verbindungen. Bei dem kleinen Testprogramm von Win32.API habe ich ja die obenstehenden Ergebnisse. Heißt das also, ich kann wie in meinem Beispiel 2000 gleichzeitige Verbindungen zu meinem Server haben ? |
AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen
Ja, die 2000 Verbindungen sind auf jeden Fall möglich, vielleicht auch mehr. Es könnte auch gut seinen, dass Windows in diesem Fall limitiert, da alle Connects von der selben IP kommen.
Ich habe es gerade nochmal auf einen Windows XP getestete, hier ist nach ca. 2000 Connects Schluss (Indy 10.5.7). Es scheint also allein am OS zu liegen und eine "Limitierung" im TCP/IP-Stack zu seinen. --Win32 |
AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen
Die maximale Threadanzahl (pro Prozess) ist nicht vom physikalischen Speicher abhängig sondern vom virtuellen Adressraum. Ein Thread belegt den Speichern nicht wirklich, sondern er belegt nur den Adressraum. Erst wenn der Stack tatsächlich benutzt wird, wird physikalischer Speicher verwendet. Siehe dazu auch:
![]() ![]() Ich habe beim Linker die Max. Stackgröße gegenüber dem Standardwert halbiert ($80000) und bekomme dann mit dem Testprogramm von Win32 doppelt soviele Verbindungen (rund 4000). Wenn ich die Max Stackgröße auf 65536 heruntersetzt, steigt die Anzahl der Verbindungen unter XP nicht weiter an, weil XP anscheinend nur die Ports 1025..5000 (=>3976 mögliche Verbindungen) belegt. Bei W7-64 werden nach meinen aktuellen Untersuchungen die Ports 49155..65535 belegt. Hier bekomme ich dann 6019 gleichzeitige Verbindungen. D.h. abweichend von meiner ersten Antwort, ist mein jetziger Kenntnisstand: Die maximale Anzahl der gleichzeitigen Serververbindungen ist durch die maximale Anzahl der gleichzeitigen Threads und die Anzahl der belegbaren Ports begrenzt. |
AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen
Zitat:
|
TIdTCPServer
Hallo,
ich habe folgendes Problem. ich bin gerade in der Ausbildung und soll einen Server erstellen, der mit dem Localhost verbunden ist, und Datenströme von verschiedenen entgegennehmen soll. Für den Server habe ich mir folgenden Quelltext heruntergeladen: procedure TForm1.IdTCPServer1Connect(AContext: TIdContext); var cmd: String; begin try cmd := Trim(AContext.Connection.IOHandler.ReadLn); Label1.Caption := cmd; AContext.Connection.IOHandler.WriteLn('Bye!'); finally AContext.Connection.Disconnect; end; end; der Server sendet auch BYE an den localhost und im Label wird auch Localhost angezeigt wenn ich das im Browser eingebe. Jetzt soll ich über den Server im Browser in die Befehlszeile Variablen übergeben und ich weiss einfach nicht, wie ich das anstellen soll. Ich sollte mich dazu mit Webprogrammierung befassen aber ich komme da einfach nicht weiter; vielleicht hat ja jemand eine Idee, wie das funktioniert. |
AW: TIdTCPServer
Indy enthält eine Http Server Komponente, damit kann das umgesetzt werden.
TIdHttpServer Die enthält ein OnCommandGet Event. Das erhält die im Browser angegebenen Eingaben der Adresszeile. Sie stehen im request Objekt, das der OnCommandGet Event Händler als Parameter bekommt. |
AW: TIdTCPServer & TIdTCPClient - Verschiedene Fragen
Danke, probier ich gleich aus
:-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 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