WinSocket-Programmierung
Kommunikation mittels SendText
Eine möglichkeit zwischen Server und Client zu kommunizieren ist die SendText Methode des TCustomWinSocket Objekts. Die Syntax der Methode lautet procedure SendText(const S: string); bzw TClientSocket/TServerSocket.Socket.SendText(const S: String); Mit dieser Methode kann einem Server ein String zugeschickt werden.
Besitzer neuerer Versionen können sich die TClientSocket und TServerSocket-Komponente direkt auf das Formular ziehen. Alle anderen müssen erst eine Instanz der Komponenten erstellen. Deklariere eine globale Variable für den Server und eine für den Client, z.B. im Public-Abschnitt des Formulars:
public Server: TServerSocket; Client: TClientSocket; { Public-Deklarationen }
Diejenigen, die die Sockets aus der Komponentenleiste nutzen, sollten ihre Namen demensprechend anpassen. Sie müssen sich auch nicht um die Instanzierung der Komponenten kümmern.
procedure TForm1.FormCreate(Sender: TObject); begin //Initialisierung des Objekts (ältere Delphi-Versionen) Server := TServerSocket.Create(Form1); Client := TClientSocket.Create(Form1); try Server.Port := 10024; Server.Open; Client.Port := 10024; Client.Host := '127.0.0.1'; Client.Open; except //Im Fehlerfall wieder freigeben (ältere Versionen) Client.Free; Server.Free; end; end;
Server sowie Client müssen per Eigenschaft Port auf den gleichen Port gestellt werden. Sonst ist es nicht möglich eine Verbindung zum Server herzustellen. Auf dem Port sollte natürlich auch kein anderer Server laufen. Dem Client muss zusätzlich die IP-Adresse des Servers angegeben werden. Dies geschieht über die Eigenschaft Host. 127.0.0.1 stellt dabei die IP-Adresse des lokalen Rechners dar. Die Methode Open macht beide Komponenten bereit, Daten zu empfangen und zu senden.
Erzeugst du die Komponente manuell musst du sie auch manuell wieder freigeben. Dies geschieht im OnDestroy-Ereignis des Formulars:
procedure TForm1.FormDestroy(Sender: TObject); begin Client.Free; Server.Free; end;
Nun sind die Sockets bereit Texte zu empfangen und zu senden. In diesem Kapitel wird das versenden mittels der Methode Sendtext erläutert. Platzieren wir nun einen Button auf dem Formular und schreiben in sein OnClick-EventHandler folgendes:
procedure TForm1.Button1Click(Sender: TObject); begin Client.Socket.SendText('Hallo!'); end;
Du kannst das Programm ruhig schon testen. Der String wird erfolgreich an den Server gesendet. Zu sehen ist davon bis jetzt leider noch nichts. Dafür gibt es das Ereignis OnClientRead der Server-Komponente.
procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket); var MSG: String; begin //Der Text wird in der Variable MSG gespeichert MSG := Socket.ReceiveText;
//Der Text wird einem MemoFeld hinzugefügt
Memo1.Lines.Add(MSG);
end;
Wenn du die Komponente aus der Komponentenleiste nutzt, kannst du dem Ereignis einfach im Objektinspektor einen EventHandler zuweisen. Ansonsten musst du die Procedure per Hand hinzufügen und in der Formularklasse deklarieren. Zusätzlich muss die Procedure dem Server manuell zugewiesen werden. Erweitere das OnCreate-Ereignis um folgende Zeile:
Server.OnClientRead := ServerClientRead; //Nur bei älteren Versionen
Das Ereigniss ClientRead wird aufgerufen sobald ein Client dem Server etwas zuschickt. Die Funktion CustomWinSocket.ReceiveText gibt den empfangenen Text wieder. Dieser Text wird dann dem Memofeld hinzugefügt. Jetzt kann man den gesendeten Text auch sehen!
In diesem Beispiel wird die Client/Server-Verbindung direkt beim Start der Anwendung hergestellt. Man kann die Verbindung natürlich auch zu einem späteren Zeitpunkt herstellen (Client.Open) und später wieder trennen (Client.Close). Besteht keine Verbindung zum Server wird das Senden natürlich mit einer entsprechenden Fehlermeldung quittiert.
In den meisten Fällen handelt es sich bei Client und Server und zwei unterschiedliche Programme. Die Programme können auch auf zwei unterschiedlichen PCs laufen und miteinander kommunizieren.