![]() |
Indy TCP Client/Server: spontan Nachricht an den Server senden?
Hallo!
Ich habe einen TCP-Server, der von einem Webservice große Mengen an Daten bezieht und diese Daten ohne Verzögerunf an die Clients weiterleitet. Bis jetzt wurde die Client-Server-Kommunikation so aufgebaut, dass der Client nur unmittelbar nach der Herstellung der Verbindung die Daten an den Server sendet. Der Server pfüft die Daten. Sind die Daten in Ordnung, startet eine while-Schleife, die den Datencontainer des Clients überwacht und neue Daten sofort übermittelt. Ab diesem Moment sendet det Client gar nichts mehr an den Server. Nun soll der Client gelegentlich auch etwas an den Server verschicken. Wenn in meiner Schleife mit ReadLn auf die Daten vom Client warte, verzögert sich die Übermittlung der Daten an den Client. Wie lasse ich auf dem Server die Daten empfangen, ohne dass sich der Sendeprozess verzögert? |
AW: Indy TCP Client/Server: spontan Nachricht an den Server senden?
Zitat:
Delphi-Quellcode:
procedure CheckForClientData(const IOHandler: TIdIOHandler);
begin if IOHandler.InputBufferIsEmpty then begin // sind Daten vorhanden? IOHandler.CheckForDataOnSource(10); // blockiert maximal 10 Millisekunden if IOHandler.InputBufferIsEmpty then Exit; end; // Daten sind vorhanden: jetzt darf man (blockierend) die Client-Daten lesen ClientData := IOHandler.ReadLn(ATimeOut); // verarbeite Client-Daten ... end; |
AW: Indy TCP Client/Server: spontan Nachricht an den Server senden?
Zitat:
Wenn ich z.B. jede 10 Sekunden den InputBuffer prüfe und der Client innerhalb des Intervals etwas schickt, wirkt sich das negativ auf das Senden der Daten aus? Mir ist halt sehr wichtig, dass das Senden nicht beeinträchtigt wird. |
AW: Indy TCP Client/Server: spontan Nachricht an den Server senden?
2. Verbindung auf einem anderen Port?
Mavarik |
AW: Indy TCP Client/Server: spontan Nachricht an den Server senden?
Zitat:
|
AW: Indy TCP Client/Server: spontan Nachricht an den Server senden?
Zitat:
|
AW: Indy TCP Client/Server: spontan Nachricht an den Server senden?
Vielleicht könnte man mit select auch ohne zweiten Thread auskommen. Keine Ahnung wie Indy (uÄ) das unterstützen.
Mögliches Vorgehen:
Mit nicht-blockierenden Socketoperation lässt sich viel anstellen :mrgreen: |
AW: Indy TCP Client/Server: spontan Nachricht an den Server senden?
Zitat:
Zitat:
|
AW: Indy TCP Client/Server: spontan Nachricht an den Server senden?
Zitat:
Der IOHandler wird unsynchronisiert verwendet (zu synchronisieren würde den Vorteil des zweiten Threads wieder aufheben. Der schreibende Thread darf dann aber auch nie lesen - sollte das erforderlich sein, muss synchronisiert werden damit nicht zwei Threads lesen. |
AW: Indy TCP Client/Server: spontan Nachricht an den Server senden?
Zitat:
Muss ich in beiden Threads aud IOHandler zugreifen oder kann ich irgendwie direkt auf Lese- bzw. Schreibstrem zugreifen? |
AW: Indy TCP Client/Server: spontan Nachricht an den Server senden?
Wenn mich nicht alles täuscht, dann ist ein Socket immer nur in dem Thread verwendbar, in dem er erzeugt wurde. Unabhängig davon, ob man seine eigenen Datenstrukturen threadsicher hat oder nicht. Deshalb habe ich bei meinen Programmen meist eine Art "Dispatch-Thread" der den Socket hält, und an Queues der Worker-Threads eingehende Kommunikation verteilt, sowie ausgehende in einer eigenen Queue verwaltet.
Ich hatte zwar nicht Indy benutzt sondern die alten TClient- bzw. TServerSocket Kompos, aber imho dürfte man auch bei Indy auf die Nase fallen, wenn man einen Socket aus mehreren Threads heraus direkt benutzt. Ich bin halt nicht 100% sicher, aber das wäre überprüfungswürdig bevor man viel Zeit in ein Design steckt, dass am Ende doch nicht gehen könnte. |
AW: Indy TCP Client/Server: spontan Nachricht an den Server senden?
Zitat:
Ich habe zwar Remy Lebeau so verstanden dass es im Prinzip gehen muss, aber bei Threads gilt "The proof of the pudding is in the eating" :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 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