Einzelnen Beitrag anzeigen

Benutzerbild von holger_barntrup
holger_barntrup

Registriert seit: 1. Feb 2007
Ort: Barntrup
97 Beiträge
 
Delphi 10.4 Sydney
 
#1

Mit Server auf OnConnect reagieren wie?

  Alt 15. Mai 2019, 11:42
Hallo zusammen
Nach Ewigkeiten mal wieder ein Beitrag.
Ich hatte mir mal ein ein Beispiel für einen Server heruntergeladen und etwas damit herumprobiert.
Was ich nicht hin bekomme ist bei einem Connect eines Clients dem zu antworten.

Hier mal der Code (Ist auch hier aus dem Forum):



Code:
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.
  Mit Zitat antworten Zitat