[ zurück ] Icon

Programmierung eines EchoServers
mit Delphis neue Internetkomponenten aus der Unit ScktComp

Der Echodienst

Der Echodienst gehört zu den simpelsten Diensten in einem TCP/IP-Netzwerk. Sie finden ihn auch an vielen Stellen im Internet. Dabei geht es um folgendes:

Der Echodienst läuft auf Port 7 des TCP/IP-Systems. Ein dort arbeitender Server wartet auf eventuelle Verbindungswünsche der Clients. Diese nimmt er an (oder auch nicht). Danach besteht seine ganze Funktion darin, die ankommenden Zeichen des Client entgegenzunehmen und postwendend an ihn zurückzusenden. Deswegen auch den Name Echo. Die ganze Sache dient also mehr oder weniger zu Testzwecken, ob das Netzwerk überhaupt Daten sendet und empfängt.

Sie können diesen Dienst ruhig erst einmal ausprobieren, ehe Sie sich zum Einstieg in die Materie der TCP/IP-Programmierung unter Delphi in das Projekt vertiefen. Viele Internetprovider lassen auch den Echodienst laufen. Als Client benutzen Sie das Programm TelNet. Es gehört zu Win95 dazu.

Gehen Sie online. Rufen Sie in TelNet im Menü Verbinden - Netzwerksystem auf. Als Hostname geben Sie einen Domain-Namen oder eine IP-Nummer ein, auf der Sie einen Echoserver vermuten. Wenn Sie gar keinen kennen, probieren Sie es mit www.kamenz.de (aber psssst! - nicht weitersagen!). Als Anschluß wählen Sie echo bzw. tragen nur 7 für Port 7 ein. Der Terminaltyp bleibt auf vt100.

Nach dem Klick auf Verbinden wird's spannend. Sie können jetzt etwas über den Umweg von zig Kilometern Internetleitung in Ihr eigenes TelNet-Fenster schreiben. Falls alle Buchstaben doppelt erscheinen, liegt das nicht am Glas auf Ihrem Schreibtisch. Sie brauchen lediglich den Haken unter Terminal - Einstellungen - lokales Echo wegzunehmen. Schon sehen Sie klarer.

So, nun wissen Sie hoffentlich, was der Echodienst ist. Und einen Server dazu können Sie mit Delphis TCP/IP-Komponenten schnell selbst zusammenbauen. Der läuft dann in Ihrem lokalen Netzwerk oder auch auf Ihrem einzelnen PC als Localhost. Und Sie können sich über diesen kurzen Umweg selbst etwas ins TelNet-Fenster schreiben. Als Einstieg in die Materie reicht das allemal.

Das Projekt

Voraussetzung zum Projekt ist, daß Sie Delphi 3 haben. Mit Delphi 2 wird es nichts werden. Außerdem muß die Unit ScktComp da sein. Durchsuchen Sie Ihr Delphi-Verzeichnis nach ScktComp.dcu. Bei mir findet sich sogar ScktComp.pas. Das geht auch. Und dann endlich los!

Eigentlich braucht der EchoServer kein eigenes Fenster. Einfacher ist es aber, doch eines zusammenzubasteln. Dann sieht man wenigstens etwas. Meine Variante sieht so aus:

EchoServer
Da die Komponenten aus der Unit ScktComp nicht in der VCL installierbar sind (jedenfalls bei mir nicht), müssen Sie per Programmcode konstruiert werden. Wer Delphis Client/Server besitzt, hat es einfacher. Er braucht den notwendigen TServerSocket nur aus der Komponentenpalette in das Formular zu ziehen.

Nehmen Sie als erstes die Unit ScktComp in die uses-Klausel auf.
uses Windows, SysUtils, Classes, Forms, Controls, StdCtrls, ComCtrls, ScktComp;
Nun kommt die Codekonstruktion der Komponente TServerSocket. So schwer ist das aber auch nicht. In der Klassendefinition der Form sind nur einige private Einträge notwendig: der ServerSocket und seine Ereignisprozeduren.
type
  TFrmMain = class(TForm)
    StatusBar: TStatusBar;
    Label1: TLabel;
    TxCl1: TLabel;
    Label2: TLabel;
    TxCl2: TLabel;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    SrvSock: TServerSocket;   // der Server-Socket
    procedure Listening(Sender: TObject; Socket: TCustomWinSocket);
    procedure Connecting(Sender: TObject; Socket: TCustomWinSocket);
    procedure DisConnecting(Sender: TObject; Socket: TCustomWinSocket);
    procedure Reading(Sender: TObject; Socket: TCustomWinSocket);
    procedure IsError(Sender: TObject; Socket: TCustomWinSocket;
                     ErrorEvent: TErrorEvent; var ErrorCode: Integer);
  public
    { Public-Deklarationen }
  end;
Während Delphi das Hauptfenster konstruiert, wird auch der ServerSocket eingerichtet. In der Prozedur FormCreate laufen im Einzelnen ab:
procedure TFrmMain.FormCreate(Sender: TObject);
begin
 SrvSock:=TServerSocket.Create(self);
 SrvSock.Service:='echo'; {oder SrvSock.Port:=7;}
 SrvSock.ServerType:=stNonBlocking;
 SrvSock.OnListen:=Listening;
 SrvSock.OnClientConnect:=Connecting;
 SrvSock.OnClientDisConnect:=DisConnecting;
 SrvSock.OnClientRead:=Reading;
 SrvSock.Open;
end;
Und das war schon das Schlimmste! Natürlich muß das private ServerSocket-Objekt in FormClose wieder freigegeben werden. Aber das sehen Sie ja aus dem Gesamtlisting im Anhang.

Nun sind noch die Event-Prozeduren für den ServerSocket zu schreiben. Für den Empfang beispielsweise sieht das so aus:
procedure TFrmMain.Reading(Sender: TObject; Socket: TCustomWinSocket);
var sTx: String;
begin
 sTx:=Socket.ReceiveText;
 StatusBar.SimpleText:='empfangen: '+sTx;
 Socket.SendText(sTx);
end;
Der ServerSocket liest, was der Client so schickt. Zur Kontrolle für Sie wird alles in der Statuszeile dargestellt. Danach gehen die Empfangsechos postwendend an den Client zurück. So einfach ist das.

Die anderen Prozeduren sind ähnlich. Ach so: Der Server soll nur zwei Clients gleichzeitig bedienen. Meldet sich ein dritter an, wird der abgelehnt. Das erledigt die Connecting-Routine so nebenbei mit. Feinheiten erkennen Sie sicher selbst im Gesamtlisting. Und damit ist Ihr erster TCP/IP-Server fertig. Glückwunsch!!!

Ich hoffe, Sie finden einen Einstieg. Sofern ich dazu komme, beantworte ich auch Ihre Fragen per e-Mail.

Disk Gesamtlisting als Zip-Archiv mit Echo2.DPR, Main.DFM und Main.PAS (2 KByte)

J. Hummel,   Mai 1998

[ Startseite ] [ TCP/IP-Seite ]