unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPServer,
  SyncObjs;

type
  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    Label1: TLabel;
    txtCount: TEdit;
    txtFrom: TEdit;
    Label2: TLabel;
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  section: TCriticalSection;
  processed: Integer; //Количество обработанных запросов

implementation

{$R *.dfm}

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  strText: string;
begin
  //Принимаем от клиента строку
  strText := AThread.Connection.ReadLn;
  //Отвечаем
  AThread.Connection.WriteLn('Принял строку:' + strText);

  //Обновим сведения на форме сервера (сервер многопоточный,
  //поэтому используем синхронизацию)
  section.Enter;
  Inc(processed,1);
  txtCount.Text := IntToStr(processed);
  txtFrom.Text := AThread.Connection.Socket.Binding.PeerIP;
  section.Leave;
  //Закрываем соединение с пользователем
  AThread.Connection.Disconnect;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  section := TCriticalSection.Create;
end;

end.
