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.


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:


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.


(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.

(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.

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).

        


(FvSG 30.1.2006)