Home » Tutorials » Netzwerk und Internet » Indy

Indy

TCP (TIdTCPClient)

TCP allgemein

TCP/IP ist heute als „das“ Internetprotokoll bekannt. Auch in lokalen Netzen wird TCP/IP immer häufiger eingesetzt. Genau genommen handelt es sich bei TCP/IP um zwei Protokolle: TCP, das Transmission Control Protocol gehört zur Transportschicht, erstellt eine Verbindung zwischen zwei Hosts und sichert die Datenübertragung. Dabei baut es auf das IP (Internet Protocol), die Vermittlungsschicht, auf. Beides sind Entwicklungen des amerikanischen Verteidigungsministeriums (Department of Defense, DoD).
TCP/IP ist die Grundlage für alle Internetanwendungen (z. B. Telnet, FTP, SMTP).

IdTCPClient

Entsprechend wird die TCP-Client-Komponente nur für einen einfachen Verbindungsaufbau zwischen einem Client und einem Server verwendet.
Um das demonstrieren zu können, benötigen wir zuerst eine kleine Server-Anwendung.

Server

Dazu erstellen wir eine neue VCL-Formularanwendung und platzieren eine TIdTCPServer-Komponente und ein TLabel darauf. Das Label soll die Nachrichten, die der Server empfangen hat, darstellen. Die TIdTCPServer-Komponente muss im Objektinspektor wie folgt konfiguriert werden:

  • Active: True
  • Bindings: Neues Binding mit IP-Adresse 127.0.0.1 und Port 40000 hinzufügen:


Bei 127.0.0.1 handelt es sich um „localhost“, also den Rechner selbst. Das ist völlig unabhängig von einem Netzwerk, weshalb es auch auf jedem PC funktionieren wird, selbst wenn er mit keinem Netzwerk verbunden ist. 40000 als Port ist willkürlich gewählt. Es gibt eine Reihe von Ports, die standardmäßig genutzt werden (z.B. Port 80 für HTTP-Verbindungen). Es gibt 65535 Ports. Alle Ports ab 49152 sind frei verwendbar, da sie keiner festen Anwendung zugeordnet sind.
Nun brauchen wir noch Code, der ausgeführt wird, wenn ein Client den Server aufruft. Dafür bietet die IdTcpServer-Komponente ein OnExecute-Ereignis. Das soll bei uns so aussehen:

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var cmd: String;
begin 
  try
    cmd := Trim(AContext.Connection.IOHandler.ReadLn);
    Label1.Caption := cmd;
    AContext.Connection.IOHandler.WriteLn('Bye!');
  finally
    AContext.Connection.Disconnect;
  end;
end;

Hier wird der Text entgegengenommen, den der Client schickt, in der Variablen „cmd“ gespeichert und in Label1 (muss natürlich auf dem Formular platziert werden) angezeigt. Anschließend wird als Antwort der Text „Bye!“ zurückgeschickt und die Verbindung geschlossen.
Das war’s auch schon. Wenn wir die Anwendung starten, sehen wir das Hauptfenster – mehr nicht. Die Anwendung wartet nun darauf, dass jemand Kontakt zu ihr aufnimmt.

Client

Nun kommt die Client-Anwendung dran. Wir erstellen also eine neue VCL-Formularanwendung und platzieren diesmal eine TIdTCPClient-Komponente darauf. Außerdem noch ein TEdit zur Eingabe einer Nachricht, die an den Server geschickt werden soll, einen TButton zum Abschicken der Nachricht und ein TLabel zur Anzeige der Antwort, die vom Server kommt.
Der TIdTCPClient-Komponente muss noch mitgeteilt werden, wo sie den Server findet. Dazu sind folgende Einstellungen im Objektinspektor notwendig:

  • Host: 127.0.0.1 (eben der Host, der beim Server eingetragen ist)
  • Port: 40000 (ebenfalls der Port, der vom Server verwendet wird)

Und nun fehlt nur noch der Code, der ausgeführt wird, wenn man auf den Button klickt:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  IdTCPClient1.Connect; 
  try 
    IdTCPClient1.IOHandler.WriteLn(Edit1.Text); 
    Label1.caption := IdTCPClient1.IOHandler.ReadLn(); 
  finally 
    IdTCPClient1.Disconnect; 
  end; 
end;

Was passiert hier? Zuerst lassen wir den Client eine Verbindung zum Server aufbauen (Connect). Falls der Server nicht erreichbar ist, z.B. weil wir die Server-Anwendung noch nicht gestartet haben, fliegt hier eine EIdSocketError-Exception.Konnte die Verbindung aufgebaut werden, wird der Text aus dem Eingabefeld Edit1 per WriteLn an den Server geschickt und anschließend direkt die Antwort mittels ReadLn gelesen und in Label1 angezeigt. Zum Schluss wird die Verbindung wieder getrennt.
Der Austausch von Textbotschaften zwischen zwei Programmen auf TCP-Basis ist also nicht sehr kompliziert. Baut man das weiter aus, erhält man einen Chat.