Programmieren
Programmierung eines Client Servers
Die beiden Komponenten TServerSoket und TClientSocket sind sehr ähnlich aufgebaut. Sie stammen von einem gemeinsamen Vorfahren ab, nämlich TCustomSocket. Weitere Netz-relevante Gemeinsamkeiten( wie z.B. Service oder ThreadChacheSize) dienen zur bequemeren Handhabung und erhöhen die Betriebssicherheit. Bemerkungen zum Betrieb der Komponenten:
Zur Identifizierung und Adressierung in einem TCP/IP-Netz dient die IP-Adresse jedes Rechners. Nur im ClientSocket ist eine Eigenschaft vorgesehen nicht aber im Server. Die Adresse des eigenen Rechners kann durch die Socket-Komponente intern bestimmt werden, indem diese beim Betriebssystem nachfragt. Der Benutzer muss im Client-Programm die Zieladresse des gewünschten Servers angeben – und daher genügt es, wenn die TClientSocket-Komponente über die Eigenschaft Adress verfügt.Bevor das Client-Programm Daten zum Server-Programm übertragen kann, müssen die beiden Sockets miteinander verbunden werden. Dazu muss die TCP/IP-Adresse des gewünschten Zielrechners in die Eigenschaft Adress der TClientSocket-Komponente eingetragen und dann deren Prozedur Open aufgerufen werden. Wenn die Verbindung erfolgreich eingerichtet werden kann, tragen die beiden kommunizierenden Socket-Komponenten die Adressdaten der Verbindung( Adresse und Port) jeweils für beide beteiligten Rechner in die Eigenschaftsfelder LocalAdress, LocalPort, RemoteAddress und RemotePort ein. Mit „Local..“ meint man den Rechner, auf dem der Socket selbst läuft, „Remote..“ meint den entfernten Rechner am anderen Ende der TCP/IP-Verbindung. Eine erfolgreich hergestellte Verbindung erkennt man daran, dass im Server-Programm das Ereignis OnAccept der TServerSocket-Komponente eintritt sowie im Client-Programm das Ereignis OnConnect. Schlägt der Verbindungsaufbau fehl, dann tritt im Client-Programm in jedem Fall das Ereigniss OnError ein.
Zur Identifizierung und Adressierung in einem TCP/IP-Netz dient die IP-Adresse jedes Rechners. Nur im ClientSocket ist eine Eigenschaft vorgesehen nicht aber im Server. Die Adresse des eigenen Rechners kann durch die Socket-Komponente intern bestimmt werden, indem diese beim Betriebssystem nachfragt. Der Benutzer muss im Client-Programm die Zieladresse des gewünschten Servers angeben – und daher genügt es, wenn die TClientSocket-Komponente über die Eigenschaft Adress verfügt.Bevor das Client-Programm Daten zum Server-Programm übertragen kann, müssen die beiden Sockets miteinander verbunden werden. Dazu muss die TCP/IP-Adresse des gewünschten Zielrechners in die Eigenschaft Adress der TClientSocket-Komponente eingetragen und dann deren Prozedur Open aufgerufen werden. Wenn die Verbindung erfolgreich eingerichtet werden kann, tragen die beiden kommunizierenden Socket-Komponenten die Adressdaten der Verbindung( Adresse und Port) jeweils für beide beteiligten Rechner in die Eigenschaftsfelder LocalAdress, LocalPort, RemoteAddress und RemotePort ein. Mit „Local..“ meint man den Rechner, auf dem der Socket selbst läuft, „Remote..“ meint den entfernten Rechner am anderen Ende der TCP/IP-Verbindung. Eine erfolgreich hergestellte Verbindung erkennt man daran, dass im Server-Programm das Ereignis OnAccept der TServerSocket-Komponente eintritt sowie im Client-Programm das Ereignis OnConnect. Schlägt der Verbindungsaufbau fehl, dann tritt im Client-Programm in jedem Fall das Ereigniss OnError ein.
Das Abseden eines Datenpakets wird im Client durch einen Aufruf von Socket.SendText angestoßen, bei der Prozedur muss der zu sendende Text übergeben werden. Dies geschieht üblicherweise in der Click-Prozedur eines „Senden“-Knopfes. Wenn man den von Delphi vergebenen Standardnamen für Ihren ClientSocket behalten hat und der zu sendende Text in einer Edit-Komponente namens Edit1 steht, könnte der Quelltext für das Senden so aussehen:
|
Das Empfangen eines Datenpakets am Server kann nicht durch einen Knopfdruck ausgelöst werden, weil man nicht weiß, wann ein Paket ankommen wird. Die ServerSocket-Komponente überwacht dies jedoch selbständig: immer wenn ein Datenpaket ankommt, wird das Ereignis OnClientRead ausgelöst. Man erzeugt also zu dem Ereignis eine zugehörende Ereignisprozedur, indem man im Objekt-Inspektor den ServerSocket1 selektiert und dann auf der Registerseite „Ereignisse“ einen Doppelklick auf das Datenfeld neben OnClientRead macht. Delphi erzeugt dann eine Prozedur mit folgendem Kopf:
|
Auffällig ist hier, dann neben dem inzwischen vertrauten (noch nie benutzen) Parameter „Sender“ noch ein weiterer Parameter namens „Socket“ vorhanden ist. Dieser Socke ist für die Weitergabe des Datenpakets zuständig, durch dessen Ankunft wird das aktuelle Ereignis ausgelöst. Man kann das Datenpaket also auslesen, indem man die Funktion Socket.ReceiveText dieses Sockets aufruft:
|