Home » Tipps & Tricks » Netzwerk/Internet » Netzwerk » Daten zwischen zwei Rechnern austauschen

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;