![]() |
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 |
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 |
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. |
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: ![]() ![]() ![]() ![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:07 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