![]() |
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.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. |
| 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. |
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. |
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. |
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. |
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.

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

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

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