Daten zwischen zwei Rechnern austauschen
Um Daten zwischen zwei Rechnern zu übertragen, verwenden wir die zwei Komponenten TServerSocket und TClientServer, die zum Lieferumfang von Delphi gehören.
Wir schreiben zwei Programme: Das eine ist der Client mit der ClientSocket-Komponente, das andere der Server mit der ServerSocket-Komponente.
Verbindungsaufbau
Server:
procedure TfrmServer.FormCreate(Sender: TObject); begin ServerSocket.Port := 23; //Festlegung des Ports ServerSocket.active := true; //Aktivierung der ServerSocket end;
Client:
procedure TfrmClient.FormCreate(Sender: TObject); begin ClientSocket1.Port := 23; //Festlegung des Ports ClientSocket1.Host := '127.0.0.1'; //IP des Zielrechners ClientSocket1.active := true; //Aufbau der Verbindung end;
Beim Server kann man den Port frei festlegen (sofern er nicht schon von anderen Programmen genutzt wird und mit der Obergrenze von ca. 65000); der Client muss als Host die Adresse des Rechners, auf dem das Serverprogramm läuft, angeben (127.0.0.1 für den lokalen Rechner) und den Port, der vom Server abgehört wird.
Der Server läuft, der Client versucht, Kontakt zu ihm aufzunehmen. Der Server wartet bis er eine Nachricht erhält.
Nachricht senden
Client: Wir setzen auf das Client-Fenster einen Button. Ein Klick darauf soll einen Text an den Server schicken:
procedure TfrmClient.Button1Click(Sender: TObject); begin if ClientSocket1.Active then ClientSocket1.Socket.SendText('Hallo Server'); end;
Server: Im Server müssen wir eine Ereignisbehandlungsroutine dafür implementieren (OnClientRead von TServerSocket):
procedure TfrmServer.ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Lines.Add(Socket.ReceiveText); end;
Der empfangene Text wird in einem Memo ausgegeben.
Antworten
Der Server antwortet:
ServerSocket1.Socket.Connections[0].SendText('Hallo zurück');
Verbindung trennen
Werden die Anwendungen geschlossen, sollte die Verbindung wieder getrennt werden:
Server:
procedure TfrmServer.FormClose(Sender: TObject; var Action: TCloseAction); begin ServerSocket.active:=false; end;
Client:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin ClientSocket1.Active:=false; end;