Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Threadsichere Kommunikation mit ServerSocket u. Clientsocket (https://www.delphipraxis.net/60441-threadsichere-kommunikation-mit-serversocket-u-clientsocket.html)

ils566 6. Jan 2006 23:15


Threadsichere Kommunikation mit ServerSocket u. Clientsocket
 
Hallo,

vielleicht hat hier jemand einen Tipp für mich. Ich möchte von einem Serverprogramm an mehrere Clients Datensätze asynchron über eine ServerSocket und eine ClientSocket Komponente schicken.

Die Indy-Komponenten möchte ich nicht verwenden, da das Exception-Handling meiner Ansicht nach "annyoing" ist.

Im Client wird bei OnClientSocketRead die Funktion:

msg := Socket.ReceiveText;

aufgerufen.

Der Server schickt testweise mehrere Strings hintereinander an den Client

for i:=1 to 10 do
begin
ClientList[0].Socket.SendText( msg);
// delay (300); <- mit delay (300ms) funktioniert es!
end;

Wenn nach jedem senden eine Pause gemacht wird, funktioniert es.
Wenn keine Verzögerung da ist, "überschlägt" sich der Client und die Daten geraten durcheinander.

Die Hilfe (D6) gibt leider kein (versätndliches) Beispiel für eine "threadsafe" Behandlung bei
den ServerSocket und ClientSocket Kompos.
Hat jemand Erfahrung wie es OHNE den delay-workaround richtig geht?

Grüße
ILS

gsh 7. Jan 2006 01:34

Re: Threadsichere Kommunikation mit ServerSocket u. Clientso
 
Des Problem hatte ich auch schon. Es so wen du die Datensätze zu schnell hintereinander sendest dann werden sie zusammen in den Receive Text geschrieben.

Bsp:
Client:
Befehl1
Befehl2

Server:
Befehl1Befehl2

Also entweder du sendest einen Datensatz und wartest dann auf ein OK des es gut angekommen ist und schickst dann den nächsten Datensatz oder du machst vor jeden Befehl z.b. ein #-Zeichen und prüfst dann auf dieses Zeichen und unterteilst dann die Befehle wieder

alzaimar 7. Jan 2006 11:03

Re: Threadsichere Kommunikation mit ServerSocket u. Clientso
 
Ich kenn mich zwar mit den Komponenten nicht aus, aber ich denke, gsh hat Recht: Ein Port ist ja nur ein Ausgang oder eine Verbindung zu einem anderen Rechner. Der kenn doch deine Befehle nicht. Dem wird nur mitgeteilt:"Sende dies" und "Sende das". Das macht der auch. 1:1.
Wenn Du von verschiedenen Threads (oder auch von einem Thread, aber kurz hintereinander) dort etwas reinschreibst, musst Du es trennen. Oder anders ausgedrückt: Du solltest deine Befehle, oder was auch immer Du verschicken willst, so kapseln, das sie auf der Gegenseite auch als solche zu empfangen sind.

gsh hat Dir eine einfache, aber praktikable Möglichkeit gezeigt. Eine zweite wäre XML. Wichtig ist, das die Empfängerseite genau weiss, wann ein 'Block' zuende ist, und der Nächste anfängt.

Muetze1 7. Jan 2006 15:51

Re: Threadsichere Kommunikation mit ServerSocket u. Clientso
 
Wie bitte? Es ist völligst schnurz-piep-egal, wie schnell oder wie langsam etwas hineingeschrieben wird. Die Sockets übertragen die Daten 1:1 und geben dabei überhaupt keine Garantie, dass die Daten in gleichen Blöcken wieder rauskommen. Das wäre Murks, weil das ist Aufgabe des Protokolls, was eine Schicht höher liegt als die reine Datenübertragung. Die Sockets übertragen die Daten 1:1, wenn du die Daten ordentlich handeln willst, musst du sie auseinander halten, das ist nicht Aufgabe der Sockets.

Siehe dazu:
http://www.delphipraxis.net/internal...ct.php?t=53882
http://www.delphipraxis.net/internal...ct.php?t=38152
http://www.delphi-forum.de/viewtopic.php?t=53762
http://www.delphi-forum.de/viewtopic.php?t=51478
http://www.delphi-forum.de/viewtopic.php?t=50463


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 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