kopf
brlogo
fensterobenrechts
   
   
fensteruntenblau
   
 
header
 

bt_backward   bt_index   bt_forward

TServerSocket_10  Die Komponente TServerSocket

 

Das Objekt TServerSocket verwaltet die Socketvrbindungen für einen TCP/IP Server. Ein aktives TServerSocket-Objekt stellt einen Socket zur Verfügung, an dem sich Clientsockets anmelden können, und erzeugt für jeden angemeldeten Client zusätzlich einen weiteren Socket für die Kommunikation.

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

 

 

Kurzbeschreibung

 

Mithilfe der Socket-Komponenten lassen sich Socket, 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 TServerSocket

 

Methoden

 

constructor Create (AOwner: TComponent);
Die Konstruktor Create erzeugt ein Exemplar von TServerSocket zur Laufzeit. ServerSocket-Objekte, die während des Entwurfs in einem Formular platziert wurden, werden automatisch erzeugt.
 
destructor Destroy;
Der Destruktor Destroy gibt ein Exemplar von TServerSocket wieder frei. Die Methode Free verwendet ebenfalls diesen Destruktor. Free überprüft, ob der Serversocket nicht bereits nil ist, und ruft Destroy nur bei Bedarf auf.
 
procedure Open;
Die Methode Open öffnet die Socketverbindung und initialisiert sie. Hierzu wird ein Port benötigt den man der Eigenschaft Port zuweisen muss. Als IP Adresse wird die IP Adresse des Computers genutzt, auf dem das Programm ausgeführt wird. Die Eigenschaft Active wird auf True gesetzt. Der Serversocket steht dann für den Verbindungsaufbau mit einem Clientsocket zur Verfügung.

procedure Close;
Die Methode Close schließt die Socketverbindung. Rufen Sie Close auf, um die Socketverbindung zu schließen. Close setzt die Eigenschaft Active auf False.
 

Eigenschaften im Objektinspektor

 


Eigenschaft
Typ
Beschreibung
x
Active Boolean
gibt an, ob die Socketverbindung geöffnet und für die Kommunikation mit anderen Systemen verfügbar ist.
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 denselben Port.

ServerType

bestimmt, ob alle vom Serversocket akzeptierten Verbindungen nicht blockierend sind oder ob automatisch ein separater Thread angegeben wird.

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. Server können in einer SERVICES-Datei zusätzliche Dienste und zugehörige Schnittstellen (Eigenschaft Port) angeben.

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.

ThreadCacheSize
Integer
gibt die maximale Anzahl der Threads an, die für neue Client-Verbindungen wieder verwendet werden können.
  x  = wichtige Eigenschaft in diesem Zusammenhang

 

Eigenschaften zur Laufzeit

 


Eigenschaft
Beschreibung
 x
Socket Mithilfe der Eigenschaft (Property) Socket wird eine Server-Socketverbindung zur Laufzeit des Programms verwaltet. Durch diese Eigenschaft wird ein Objekt der Klasse TServerWinSocket verfügbar, das die Funktionalität eines Serversockets kapselt, und wiederum Eigenschaften und Methoden besitzt.

 

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 Socketvrbindung verwendeten Ports an.

SocketHandle

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

 

Im Gegensatz zur Eigenschaft Socket eines Clientsockets, die ein TClientWinSocket-Objekt kapselt, verwaltet ein TServerWinSocket-Objekt  alle Informationen über die aktuell auf dem Serversocket aktiven Verbindungen.

 

Socket:  Spezielle Eigenschaften von TServerWinSocket

 


Eigenschaft
Typ
Beschreibung
 x  ActiveConnections
Integer
gibt die Anzahl der geöffneten Verbindungen zu Clientsockets an.

ActiveThreads
Integer
gibt die Anzahl der TServerClientThread-Objekte an, die aktuell von dem in der Feldstruktur Connections aufgeführten Socket-vrbindungen verwendet werden
 x
Connections
führt alle geöffneten Socketverbindungen zu Clientsckets auf.

IdleThreads
Integer
gibt die Anzahl der nicht verwendeten TServerClientThread-Objekte an, die sich im Zwischenspeicher befinden.

ServerType

bestimmt, ob alle vom Serversocket akzeptierten Verbindungen nichtblockierend sind oder ob automatisch ein  separater Thread angegeben wird.
   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 OnAccept
unmittelbar nach dem Akzeptieren der Verbindung mit einem Clientsocket
 
property OnClientConnect
wenn ein Clientsocket eine vom Serversocket akzeptierte Verbindung einrichtet
 
property OnClientDisconnect
wenn eine der Verbindungen zu einem Clientsocket geschlossen wird

 

Ereignisse für die Kommunikation:

 

property OnClientRead
Das Ereignis OnClientRead tritt ein, wenn ein Serversocket Informationen aus der Socketverbindung lesen soll. Schreiben Sie eine Behandlungsroutine für das Ereignis OnClientRead, um aus der Socketverbindung zu lesen.
 
property OnClientWrite
Das Ereignis OnWrite tritt ein, wenn ein Serversocket 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 OnClientError
Das Ereignis OnClientError tritt ein, wenn beim Einrichten, Verwenden oder Beenden der Socketverbindung zu einem Clientsocket ein Fehler auftritt. In einer Behandlungsroutine für OnClientError können Sie auf Fehler reagieren, die in Zusammenhang mit einer Socketverbindung auftreten. Wenn die Ereignisbehandlungsroutine für OnClientError die Fehlerbedingung erfolgreich behandeln konnte, setzen Sie den Parameter ErrorCode auf 0, damit keine ESocketError-Exception ausgelöst wird.

 

Sonstige Ereignisse (in diesem Zusammenhang unwichtig):

 

property  OnGetSocket
Das Ereignis OnGetSocket tritt ein, wenn der Serversocket ein neues TServerClientWinSocket-Objekt erstellen muss, das den Server-Endpunkt einer Verbindung zu einem Clientsocket repräsentiert.
 
property OnGetThread
Das Ereignis OnGetThread tritt ein, wenn der Serversocket einen neuen Thread für eine Verbindung zu einem Clientsocket erzeugen muss.
 
property OnThreadStart
Das Ereignis OnThreadStart tritt ein, wenn der Thread für eine Verbindung zu einem Clientsocket gestartet wird.
 
property OnThreadEnd
Das Ereignis OnThreadEnd tritt ein, wenn eine Client-Socketverbindung und der damit verbundene Thread beendet werden.
 

 

Einige Hinweise zur inneren Struktur der Komponente TServerSocket

 

Die Klasse TServerSocket 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, auch wenn diese für die Verwaltung der Sockets nicht benutzt wird.

 

TServerSocket_30

(Abb. Klassenhiearchie der Socket-Komponenten)

 

Aktive Serversocket-Objekte stellen ein Socket-Objekt für die Verbindungsaufnahme eines Clients mit dem Server zur Verfügung, zusätzlich für jede erfolgreiche Kontaktaufnahme einen weiteren Socket für die Kommunikation mit dem Clientsocket. Die gesamte Verwaltung dieser Sockets übernimmt ein Objekt der Klasse TServerWinSocket. Die Kommunikation zwischen Verwaltungsobjekt und Komponente übernimmt die Eigenschaft Socket.

TServerSocket_41

(Abb. WinSocket-Klassen kapseln Sockets)

 

Der Verbindungssocket wird in dem internen Attribut FServerSocket: TServerWinSocket verwaltet, für die "Kommunikatons-Sockets" existiert das Attribut FConnections: TList, das über die Eigenschaft Connections  administriert wird.

 

TServerSocket_20

(Abb. Server-Socket: Verwaltung verbundener Client-Sockets)

 

Sowohl die Komponente TServerSocket als auch die Klasse TServerWinSocket sind also Endpunkte eine Hierarchie von Klassen. Die Definition der hier beschriebenen Benutzerschnittstellen und  Zusammenhänge verteilt sich auf die einzelnen 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 diese Klasse im Quelltext zu analysieren (Datei SktComp.pas, Bestandteil der Professional-Versionen von Delphi 5 und höher).

 

   bt_top  

 


(FvSG 30.1.2006)

 

 
 
Sunday, 19. November 2017 / 20:55:40