kopf
brlogo
fensterobenrechts
   
   
fensteruntenblau
   
   
header

bt_backward   bt_index   bt_forward

TClientSocket_10  Die Komponente TClientSocket

Das Objekt TClientSocket verwaltet die Socket-Verbindungen für einen TCP/IP Client. TClientSocket definiert die gewünschte Verbindung zu einem TCP/IP Server, verwaltet die Verbindung in geöffnetem Zustand und beendet sie bei Bedarf.

 

Die Klasse TClientSocket ist zu Programmierung von Anwendungen und Diensten, die auf das UDP Protokoll aufsetzen, nicht geeignet.

 

Kurzbeschreibung

 

Mithilfe der Socket-Komponenten lassen sich Sockets, die in diesen Komponenten gekapselt sind, Delphi-typisch verwenden.
  • Socket-Komponenten finden sich in der Komponentenbibliothek (VCL) und können zur Entwicklungszeit des Programms in das verwaltende Fenster gezogen werden.
  • Socket-Komponenten werden wie alle anderen Komponenten in der Komponentenliste des Formulars verwaltet.
  • Socket-Komponenten kapseln ihre Sockets durch Eigenschaften und Ereignisse.
  • Grundlegende Eigenschaften können bereits zur Entwurfszeit im Objektinspektor initialisiert werden, die grundlegende Eigenschaft Socket kapselt einen Socket zur Laufzeit des Programms.
  • Die Kontaktaufnahme zwischen Sockets ist ebenso wie ihre Kommunikation ereignisgesteuert.

 

Benutzerschnittstelle der Klasse TClientSocket

 

Methoden

 

constructor Create (AOwner: TComponent);
Die Konstruktor Create erzeugt ein Exemplar von TClientSocket zur Laufzeit. TClientSocket-Objekte, die während des Entwurfs in einem Formular platziert wurden, werden automatisch erzeugt.
 
destructor Destroy;
Der Destruktor Destroy gibt ein Exemplar von TClientSocket wieder frei. Die Methode Free verwendet ebenfalls diesen Destruktor. Free überprüft, ob der Client-Socket nicht bereits nil ist und ruft Destroy nur bei Bedarf auf.
 
procedure Open;
Die Methode Open öffnet die Socket-Verbindung und initialisiert sie. Die Eigenschaft Active wird dabei auf True gesetzt. Der Client-Socket sucht dann nach einem Server und übernimmt den Verbindungsaufbau.
 
procedure Close;
Die Methode Close schließt die Socket-Verbindung. Rufen Sie Close auf, um die Socket-Verbindung zu schließen. Close setzt die Eigenschaft Active auf False.
 

Eigenschaften im Objektinspektor

 


Eigenschaft
Typ
Beschreibung
x
Active Boolean
gibt an, ob die Socket-Verbindung geöffnet und für die Kommunikation mit anderen Systemen verfügbar ist.

Address
string
bezeichnet die IP Adresse des Server-Systems. Address ist ein String aus vier numerischen (Byte-) Werten, die durch Punkte voneinander getrennt werden. Beispiel: 123.197.1.2 . Wenn der Socket die Eigenschaft Host definiert, wird die Adresse für die Verbindung nicht aus der Eigenschaft Address, sondern aus der IP Adresse übernommen, die mit Host gekoppelt ist. Diese zweite Variante ist schneller, da der Socket nicht erst nach der IP-Adresse suchen muss.

ClientType

legt fest, ob der Client-Windows-Socket Informationen über die Socketverbindung asynchron liest und schreibt.
x
Host

ist ein Alias für die IP Adresse des Server-Systems. Wenn der Socket eine Verbindung öffnet, sucht er mit Hilfe des Wertes von Host nach der IP Adresse für den Serversocket.
x
Name
string
gibt den Namen der Komponente im Formular an.
x
Port
Integer
enthält die ID, die zur Bezeichnung der Server-Socketverbindung benutzt wird. Client und Server benötigen für eine Verbindung den selben Port. Standarddiensten, z.B. Chat, E-Mail etc. , sind feste Port-Nummern zugeordnet. 

Service
string
bezeichnet den Namen des Dienstes, für den die Socketverbindung eingesetzt wird. Verwenden Sie Service, um auf den Verwendungszweck der Verbindung hinzuweisen. Windows stellt eine Anzahl von Namen für Standard-Dienste bereit, z.B. ftp, http, finger und time.

Tag
Integer
speichert eine Ganzzahl als Teil der Komponente. Diese Zahl wird intern nicht verwendet und bietet dem Programmentwickler eine Speicherstelle zur freien Verfügung.

 

Eigenschaften zur Laufzeit

 


Eigenschaft
Beschreibung
 x
Socket Mithilfe der Eigenschaft (Property) Socket wird eine Client-Socketverbindung zur Laufzeit des Programms verwaltet. Durch diese Eigenschaft wird ein Objekt der Klasse TClientWinSocket verfügbar, das die Funktionalität eines Clientsockets kapselt, und wiederum Eigenschaften und Methoden besitzt.
  x  = wichtige Eigenschaft in diesem Zusammenhang

 

Socket: Gemeinsame Eigenschaften von TServerWinSocket und von TClientWinSocket

 


Eigenschaft
Typ
Beschreibung
 x
Connected
Boolean
gibt an, ob die Socketverbindung geöffnet ist und für die Kommunikation zur Verfügung steht.
 x
LocalAdress
string
gibt die IP Adresse des Systems an.
 x
LocalHost
string
enthält den Namen des Systems, in dem die Anwendung ausgeführt wird, die den Windows-Socket verwendet.
 x
LocalPort
Integer
gibt die ID Nummer des von dem Socket verwendeten Ports an

LookupState

gibt an, ob während des Öffnens der Verbindung asynchrone Aktivitäten auftreten.
 x
RemoteAdress string
legt die IP Adresse des lokalen Systems fest, das mit der Socketverbindung verbunden ist
 x
RemodeHost
string
enthält den Namen des Systems am anderen Ende der Socketverbindung.
 x
RemodePort
Integer
gibt die ID Nummer des vom entfernten System (RemoteHost) für die Socketverbindung verwendeten Ports an.

SocketHandle

gibt das Windows-Handle für den Socket an.
   x  = wichtige Eigenschaft in diesem Zusammenhang

 

Socket:  Spezielle Eigenschaften von TClientWinSocket

 


Eigenschaft
Beschreibung
  
ClientType legt fest, ob der Client-Windows-Socket Informationen über die Socket-Verbindung asynchron liest und schreibt.
   x  = wichtige Eigenschaft in diesem Zusammenhang

 

Socket:  Methoden von TClientWinSocket (Auszug)

 

function SendText (const S: string): Integer;
Schreibt eine Zeichenkette (String) in die Socketverbindung.
 
function ReceiveText: string;
Liest eine Zeichenkette (String) aus der Socketverbindung.
 
function SendBuf (var Buf; Count: Integer): Integer;
Schreibt einen beliebigen, unstrukturierten, nicht typisierten Datenbereich Buf (= 'Buffer') in die Socketverbindung. Bei der Datenübertragung ist immer die Länge Count der Daten (= Anzahl Bytes) anzugeben, damit der Empfänger weiß wie groß die Datenmenge ist.
 
function ReceiveBuf (var Buf; Count: Integer): Integer;
Liest einen beliebigen, unstrukturierten, nicht typisierten Datenbereich Buf (= 'Buffer') der Länge Count (Bytes) aus der Socketverbindung.
 

Einige Hinweise zur Verwendung dieser Methoden:

  • Die übertragenen Daten werden in den Sockets zwischengepuffert. Wird mit ReceiveText bzw. ReceiveBuf ein Datensatz gelesen, wird er anschließend  aus diesem Puffer entfernt. Ein weiteres Lesen dieser Informationen aus dem Socket ist nicht möglich.

  • Mithilfe der Systemfunktion function SizeOf (X): Integer kann der für einen untypisierten Datenbereich X benötigte Speicherplatz (= Anzahl Bytes) ermittelt werden. Beispiel:  SendText ('Hallo') ist also identisch mit SendBuf ('Hallo', SizeOf ('Hallo')).

  • Die Verwendung von SendBuf und ReceiveBuf setzt voraus, dass diese benötigte Speicherplatz konstant ist und vorher berechnet werden kann. Sogenannte 'Null-terminierte Strings' (String-Format für Programmiersprache C und Abkömmlinge) haben eine unbestimmte Länge. Verwenden Sie möglichst 'Pascal-Strings'. Beispiel:  var Zeichenfolge: string [255].

  • Die Funktions-Methoden  können 'Turbo-Pascal-typisch" auch prozedural verwendet werden. Als Funktion liefern sie über ihren  Funktionswert die Anzahl der tatsächlich übertragenen Bytes oder den Wert -1, falls keine Übertragung stattfand.
 
Ereignisse

 

Die Kommunikation zwischen den Socket-Komponenten erfolgt ereignisgesteuert. Schließlich kann ein Socket ja nicht im Voraus 'wissen', wann ein anderer Socket eine Verbindung aufbauen oder Daten austauschen möchte.

 

Ereignisse für den Verbindungsaufbau und Verbindungsabbau:

 

property OnLookup
Das Ereignis OnLookup tritt ein , wenn ein Clientsocket nach dem Serversocket sucht, zu dem die Verbindung hergestellt werden soll.
 
property OnConnect
Das Ereignis OnConnect tritt für Clientsockets ein, wenn die Verbindung zum Server geöffnet wurde. In einer Behandlungsroutine für das Ereignis OnConnect eines Clientsocket können Sie Aktionen festlegen, die nach dem Aufbau der Verbindung zu einem Serversocket ausgeführt werden.
 
property OnConnecting
Das Ereignis OnConnecting tritt für einen Clientsocket ein, nachdem der Serversocket lokalisiert wurde, aber bevor die Verbindung aufgebaut wird. In einer Behandlungsroutine für das Ereignis OnConnecting eines Clientsocket können Sie Aktionen festlegen, die direkt vor dem Aufbau der Verbindung zu einem Serversocket ausgeführt werden.
 
property OnConnect
Das Ereignis OnConnect tritt für einen Clientsocket ein, wenn die Verbindung zum Server geöffnet wurde. In einer Behandlungsroutine für das Ereignis OnConnect eines Clientsocket können Sie Aktionen festlegen, die nach dem Aufbau der Verbindung zu einem Serversocket ausgeführt werden.
 
property OnDisconnect
Das Ereignis OnDisconnect tritt direkt vor dem Schließen der Verbindung zu einem Serversocket durch den Clientsocket ein. In einer Behandlungsroutine für das Ereignis OnDisconnect können Sie Aktionen festlegen, die ausgeführt werden, kurz bevor die Verbindung zu einem Serversocket beendet wird. OnDisconnect tritt ein, nachdem die Eigenschaft Active auf False gesetzt wurde, aber bevor die Verbindung tatsächlich geschlossen wird.
 

Ereignisse für die Kommunikation:

 

property OnRead
Das Ereignis OnRead tritt ein, wenn ein Clientsocket Informationen aus der Socket-Verbindung lesen soll. Schreiben Sie eine Behandlungsroutine für das Ereignis OnRead, um aus der Socket-Verbindung zu lesen.
 
property OnWrite
Das Ereignis OnWrite tritt ein, wenn ein Clientsocket Informationen in die Socketverbindung schreiben soll. Schreiben Sie eine Behandlungsroutine für das Ereignis OnWrite, um in die Socketverbindung zu schreiben.
 

Ereignisse für die Fehlerbehandlung:

 

property OnError
Das Ereignis OnError tritt ein, wenn der Socket eine Verbindung nicht herstellen, benutzen oder schließen kann. In einer Behandlungsroutine für OnError können Sie auf Fehler reagieren, die in Zusammenhang mit einer Socketverbindung auftreten. Wenn die Ereignisbehandlungsroutine für OnError die Fehlerbedingung erfolgreich behandeln konnte, setzen Sie den Parameter ErrorCode auf 0, damit keine ESocketError-Exception ausgelöst wird.
 

 

Einige Hinweise zur inneren Struktur der Komponente TClientSocket

 

Die Klasse TClientSocket ist als Delphi-Komponente eine Unterklasse von TComponent. Socket-Komponenten besitzen also alle Merkmale von Komponenten, z. B. die Eigenschaft Name, aber auch eine Komponentenliste (Eigenschaft Components) zur Verwaltung weiterer, untergeordneter Komponenten.

 

TClientSocket_30

(Abb. Klassenhiearchie der Socket-Komponenten)

 

Aktive Client-Socket-Objekte stellen ein Socket-Objekt für die Verbindungsaufnahme des Clients mit einem Server zur Verfügung. Die gesamte Verwaltung dieser Sockets übernimmt ein Objekt der Klasse TClientWinSocket. Die Kommunikation zwischen Verwaltungsobjekt und Komponente übernimmt die Eigenschaft Socket.

 

TServerSocket_41

(Abb. WinSocket-Klassen kapseln Sockets)

 

Der Verbindungs-Socket wird in dem internen Attribut FSocket: TClientWinSocket verwaltet, für die "Kommunikatons-Sockets" existiert das Attribut FConnections: TList, das über die Eigenschaft Connections  administriert wird.

 

TClientSocket_40

 

Sowohl die Komponente TClientSocket als auch die Klasse TClientWinSocket sind also Endpunkte eine Hierarchie von Klassen. Die Definition der hier beschriebenen Benutzerschnittstellen und  Zusammenhänge verteilt sich auf diese verschiedenen Oberklassen.

 

(Hinweis in eigener Sache: Eine Quelle, die diesen Sachverhalt weiter erläutert, haben wir nicht gefunden. Dem Interessenten, der die Zusammenhänge noch genauer kennen lernen möchte (z. B. die interne Verwendung von Threads in den Socket-Objekten), bleibt daher wohl nicht anderes übrig als die Implementierung dieser Klassen im Quelltext zu analysieren (Datei SktComp.pas, Bestandteil der Professional-Versionen von Delphi 5 und höher).

 

  bt_top  

 


(FvSG 30.1.2006)

 

 
 
Monday, 20. November 2017 / 23:45:37