Einzelnen Beitrag anzeigen

RJelinek

Registriert seit: 6. Mär 2005
4 Beiträge
 
#3

Re: "Rückkanal" Bei Client/Server Anwendung

  Alt 6. Mär 2005, 14:01
Lösung bei Verwendung von Indy:

1.) Vorausgesetzt, du verwendest TCP
Auf einer Seite die IdTCPServer-Komponente, auf der anderen brauchst du eine IdTCPClient-Komponente. Nach dem Verbindungsaufbau des Clients zum Server mit Connect bekommst du über das OnConnect-Event eine IdPeerThread (die ich jetzt mal IPT nenne). Mit dieser hast du die Möglichkeit zu Senden und zu Empfangen über die Routinen IPT.Connection.Readxxx und IPT.Connection.Writexxx. Auf der Clientseite hast du per Default Readxxx und Writexxx-Routinen über die IdTCPClient-Komponente. Da eine TCP-Verbindung bidirektional funktioniert (du kannst also auf beiden Seiten sowohl Senden als auch Empfangen), ist deine Aufgabe recht leicht gemacht ...

2.) Vorausgesetzt, du verwendest UDP
Auf beiden Seiten die IdUDPServer-Komponente verwenden. Die IdUDPServer-Komponente hat ein OnRead-Ereignis und Senderoutinen. Du brauchst also keine Threads (außer das Senden funktioniert bei dir auch Thread-gestützt.)

Lösung zu Threads:
1.) Bei UDP:
Die Komponenten bieten keine Threads, aber da du Callbacks über die OnRead-Ereignisse hast, brauchst du die bei halbwegs eleganter Programmierung auch nicht.

2.) Bei TCP:
Bis jetzt habe ich auf beiden Seiten einen normalen Thread gestartet, der sowohl Senden, als auch Empfangen übernimmt. Beim Empfangen musst du allerdings allerdings unterscheiden, ob du blockierend (also warten bis Zeichen da sind) oder nicht-blockierend arbeiten willst. Beim nicht-blockierenden Verhalten rufst du zuerst XX.ReadFromStack(true,0,false) auf und danach steht in XX.InputBuffer.Size die Anzahl an empfangen Zeichen zur Verfügung (wenn da 0 drinnsteht, dann keine Read-Routine aufrufen, da du sonst blockierst).

Bei der IdTCP-Serverkomponente glaube ich gäbe es die Möglichkeit den IdPeerThread zu verwenden. Dieser ruft das OnExecute-Ereigbnis der Serverkomponente auf, die als Thread beim Server verwendet werden könnte.

Wenn du aber auf beiden Seiten einen Thread brauchst, dann empfiehlt es sich, diesen nicht zu verwenden, da du ansonsten zwei unterschiedliche Quellcodes für Sender und Empfänger hast. Meine manuell angelegten Threads kann ich aber auch beiden Seiten mit identischem Quellcode verwenden.
  Mit Zitat antworten Zitat