unit UFrmServer;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ExtCtrls, IdTcpServer, IdContext,
IdBaseComponent, IdComponent, IdCustomTCPServer;
type
TfrmServer = class(TForm)
pnlConnection: TPanel;
editPort: TEdit;
pnlPort: TPanel;
Panel1: TPanel;
editIp: TEdit;
btnStart: TButton;
ListBox1: TListBox;
procedure btnStartClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FServer: TIdTCPServer;
{ Private-Deklarationen }
protected
procedure OnExecuteEventHandler(AContext: TIdContext);
public
{ Public-Deklarationen }
end;
var
frmServer: TfrmServer;
implementation
{$R *.dfm}
procedure TfrmServer.btnStartClick(Sender: TObject);
begin
// Ein
TCP-Server nimmt Anfragen einer bestimmten Adresse entgegen und
// beantwortet diese entsprechend einem bestimmten Protokoll
// Binden der
IP Adresse
self.FServer.Bindings.Items[0].IP := self.editIp.Text;
// Binden des Ports
self.FServer.Bindings.Items[0].Port := StrToInt(self.editPort.Text);
// Die Adresse(n), auf denen der Server Anfragen entgegen nimmt setzen sich
// aus einer
IP und einem Port zusammen. Durch das Binden wurde nun eine
// solche Adresse zugewiesen, kommen Anfragen, die an diese Adresse gerichtet
// werden an, so wird der Server sie beantworten
// Hier wird der Server aktiviert, er wartet nun aktiv auf Anfragen!
self.FServer.Active := True;
// Den Start samt Uhrzeit einfach in der Listbox anzeigen, damit man sieht
// das der Server gestartet wurde (optional!)
self.ListBox1.Items.Add(FormatDateTime('hh:mm:ss', now) + ' Server Started');
end;
procedure TfrmServer.FormCreate(Sender: TObject);
begin
// Dynamisches Erzeugen eines Servers (das klappt auch mit der Turbo Delphi
// Explorer Edition)
self.FServer := TIdTCPServer.Create(self);
// Zuweisen des OnExecute Events
// Dieses wird benötigt, wenn der Server aktiviert wird
// Es wird endlos immer wieder ausgeführt (darin besteht die gesamte Arbeit
// des Servers)
self.FServer.OnExecute := self.OnExecuteEventHandler;
// Hinzufügen einer neuen Bindung (siehe btnStartClick)
self.FServer.Bindings.Add;
end;
procedure TfrmServer.OnExecuteEventHandler(AContext: TIdContext);
begin
// Hier findet die eigentliche Arbeit des Servers statt. In einem neben-
// läufigen Prozess wird diese Prozedur immer wieder aufgerufen
// Einfache Idee hier, es wird eine Zeile eingelesen und (mit Uhrzeit in die
// Listbox geschrieben
// Das eigentliche Lesen der Zeile geschieht dabei durch
// AContext.Connection.IoHandler.Readln
// AContext ist das Argument dieser Methode, der Context, in dem die
// Methode aufgerufen wurde
// Die Eigenschaft Connection gibt einem die etablierte Verbindung zurück
// IoHandler enthält den "Handler" für Input/Output-Ereignisse. Dieser bietet
// die Methode Readln an. Diese blockiert, bis Daten ankommen, liest hier die
// Daten als String aus, bis ein Zeilenende auftritt und gibt liefert diesen
// String
// Werden keine Daten empfangen, blockiert die Methode (wartet bis etwas
// ankommt)
self.ListBox1.Items.Add(FormatDateTime('hh:mm:ss', now) + ' Received Data: ' +
AContext.Connection.IOHandler.ReadLn);
// Wurde ein String empfangen, kann es noch interessant sein, von wem dieser
// String kam. Im Kontext dieser Verbindung findet sich in der Eigenschaft
// Binding die angesprochene Adresse des Servers (hier wird nur eine gebunden,
// aber es sind mehrere möglich) und die Adresse des Anfragestellers
// PeerIp und PeerPort (Anfragesteller) werden mit in die Listbox übernommen
self.ListBox1.Items.Add(FormatDateTime('hh:mm:ss', now) +
Format('Received from: %s:%d',
[AContext.Binding.PeerIP,
AContext.Binding.PeerPort]));
if AContext.Connection.IOHandler.ReadLn = 'OFF' then AContext.Connection.IOHandler.WriteLn( 'OFF wurde erfolgreich uebermittelt'+#10+#13);
end;
end.