AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Threadsichere Kommunikation mit ServerSocket u. Clientsocket

Threadsichere Kommunikation mit ServerSocket u. Clientsocket

Ein Thema von ils566 · begonnen am 6. Jan 2006 · letzter Beitrag vom 7. Jan 2006
Antwort Antwort
ils566

Registriert seit: 3. Dez 2005
28 Beiträge
 
#1

Threadsichere Kommunikation mit ServerSocket u. Clientsocket

  Alt 6. Jan 2006, 23:15
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
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#2

Re: Threadsichere Kommunikation mit ServerSocket u. Clientso

  Alt 7. Jan 2006, 01:34
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
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Threadsichere Kommunikation mit ServerSocket u. Clientso

  Alt 7. Jan 2006, 11:03
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Threadsichere Kommunikation mit ServerSocket u. Clientso

  Alt 7. Jan 2006, 15:51
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:15 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