Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert (https://www.delphipraxis.net/153247-tcp-server-bedient-mehrere-clients%3B-organisation-die-abarbeitung-nicht-gesichert.html)

Trusti75 26. Jul 2010 16:27

Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert
 
Hallo,
ich arbeite mit Delphi 2009 und verwende den Indy-TCP-Server zur Kommunikation mit mehreren Clients. Diese Clients schicken nun willkürlich Daten bzw Anfragen, auf die der Server reagieren soll.
Das tut er auch. Hierfür werte ich im Execute-Event des Servers die Informationen aus und entscheide, was passiert. Entweder wird ein Datenpaket geschnürt und dem gleichen Client zurückgegeben, oder es wird nur die Anfrage nur quittiert. Meldet sich wärend der Zeit der Bearbeitung zufälligerweise ein andere Client, dann bricht der Server das Execute-Event ab und beginnt mit der Abarbeitung dieser Anfrage. Nun meine Frage: Kann man verhindern, dass die Anfrage das Execute-Ereignis abbricht, sondern wartet? Bei vielen Clients kommt es immer wieder vor, dass sich einer meldet, aber der andere noch nicht fertig bearbeitet wurde.
Ich hoffe, es hat jemand einen Tip.

Grüsse

franktron 26. Jul 2010 17:03

AW: Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert
 
Das tut er nicht das ist nur der Debuger

Trusti75 27. Jul 2010 08:56

AW: Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert
 
>> Das tut er nicht das ist nur der Debuger <<

hmm.... ich hab ein Logfile mitlaufen, was alles mitschreibt und das sagt mir auch, das er das "Execute" des Servers abbricht und neu beginnt, sobald ein Client sich meldet. Was hat der Debugger damit zu tun?

Grüsse

franktron 27. Jul 2010 09:12

AW: Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert
 
Dann hast du was falsch gemacht.

Ich habe in D2010 eine TcpServer laufen wo bis zu 100 Client gleichzeitig ihre Anfragen abarbeiten.

TRON 27. Jul 2010 09:28

AW: Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert
 
Wichtig ist dass die Zugriffe im Execute-Event thread-sicher programmiert sind.

Trusti75 27. Jul 2010 09:28

AW: Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert
 
Zitat:

Zitat von franktron (Beitrag 1037795)
Dann hast du was falsch gemacht.

Ich habe in D2010 eine TcpServer laufen wo bis zu 100 Client gleichzeitig ihre Anfragen abarbeiten.

Ja, dass da was falsch läuft, ist die Ursache meiner Anfrage. ;-)
Aber was passiert bei Dir, wenn Clients zeitgleich anfragen? Über AContext.Bindigs.Peerip stelle ich fest, wer gerade ne Anfrage stellt. Kommt ne neue rein der verwirft er die IP und fängt mit der neuen Ip von vorn an. Meine ganze Abarbeitung findet im Execute-Ereignis statt und kann auch dauern ein paar Sekunden, was vielleicht nicht richtig ist. Oder muss ich vielleicht einen eigenen Thread für jeden Vorgang separat erzeugen? Wie machst Du das mit den Anfragen bei Gleichzeitigkeit?
Grüsse

TRON 27. Jul 2010 09:39

AW: Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert
 
Zitat:

Zitat von Trusti75 (Beitrag 1037799)
Zitat:

Zitat von franktron (Beitrag 1037795)
Dann hast du was falsch gemacht.

Ich habe in D2010 eine TcpServer laufen wo bis zu 100 Client gleichzeitig ihre Anfragen abarbeiten.

Oder muss ich vielleicht einen eigenen Thread für jeden Vorgang separat erzeugen? Wie machst Du das mit den Anfragen bei Gleichzeitigkeit?
Grüsse

Der Indy TCPServer verwaltet die Threads automatisch. Wichtig ist nur eine thread-sichere Programmierung innerhalb des Execute-Events.

Uwe Raabe 27. Jul 2010 09:49

AW: Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert
 
Zitat:

Zitat von Trusti75 (Beitrag 1037799)
Über AContext.Bindigs.Peerip stelle ich fest, wer gerade ne Anfrage stellt. Kommt ne neue rein der verwirft er die IP und fängt mit der neuen Ip von vorn an.

Jeder Client (genauer: jede Connection) bekommt einen separaten Context. Es ist also durchaus möglich, daß Execute mit verschiedenen Instanzen von AContext parallel (in separaten Threads) aufgerufen wird. Das heißt aber nicht, daß die Execute-Methoden nicht alle auch abgearbeitet werden.

Wie schon gesagt, muss man sich dieses Sachverhalts nur gewahr sein und Execute eben threadsicher programmieren.

Zur Kontrolle könntest du ja mal am Anfang und am Ende von Execute entsprechende Log-Meldungen ausgeben - mit einem threadsicheren Logger natürlich.

Oder die Poor-Programmer Lösung: InterlockedIncrement/Decrement auf eine globale (mit 0 initialisierte) Variable und am Ende schauen, ob die wieder 0 ist.

Trusti75 27. Jul 2010 10:14

AW: Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert
 
Danke für die Hilfe!! "Threadsicher" war das Stichwort. Ich hab nochmal alles kontrolliert und da war noch ne Variable, die ich übersehen hatte und damit alles durcheinander kam. Der Fehler sitzt fast immer vor dem Monitor. ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 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 by Thomas Breitkreuz