unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ActnList,
  StdCtrls, Spin, ExtCtrls, lNetComponents, lNet;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    ButtonDisconnect: TButton;
    ButtonStop: TButton;
    ButtonStart: TButton;
    Buttonsendmessage: TButton;
    ButtonConnect: TButton;
    CheckBoxOffline: TCheckBox;
    CheckBoxOnline: TCheckBox;
    CheckBoxConnection: TCheckBox;
    EditNickname: TEdit;
    EditMessage: TEdit;
    EditIPAdress: TEdit;
    GroupBox1: TGroupBox;
    GroupBoxServer: TGroupBox;
    GroupBoxChatWindow: TGroupBox;
    GroupBoxClient: TGroupBox;
    Image1: TImage;
    Label1: TLabel;
    LabelNickname: TLabel;
    LabelOffline: TLabel;
    LabelOnline: TLabel;
    LabelConnection: TLabel;
    LabelIPAdress: TLabel;
    LTCPClient: TLTCPComponent;
    //LTCPServerSender: TLTCPComponent;
    LTCPServer: TLTCPComponent;
    ServerMessages: TMemo;
    MemoChatWindow: TMemo;
    SpinEditPortServer: TSpinEdit;
    SpinEditPort: TSpinEdit;
    StaticText1: TStaticText;
    procedure Button1Click(Sender: TObject);
    procedure ButtonConnectClick(Sender: TObject);
    procedure ButtonDisconnectClick(Sender: TObject);
    procedure ButtonsendmessageClick(Sender: TObject);
    procedure ButtonStartClick(Sender: TObject);
    procedure ButtonStopClick(Sender: TObject);
    procedure LTCPClientConnect(aSocket: TLSocket);
    procedure LTCPClientDisconnect(aSocket: TLSocket);
    procedure LTCPClientReceive(aSocket: TLSocket);
    procedure LTCPServerAccept(aSocket: TLSocket);
    procedure LTCPServerDisconnect(aSocket: TLSocket);
    procedure LTCPServerError(const msg: string; aSocket: TLSocket);
    procedure LTCPServerReceive(aSocket: TLSocket);

  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Form1: TForm1;


implementation

{$R *.lfm}

{ TForm1 }
var ClientSavedServerIP:string;
              {__Server__}
//Server starten
procedure TForm1.ButtonStartClick(Sender: TObject);
begin
   if CheckBoxOnline.Checked then
      ServerMessages.Lines.Add('Server bereits online')
   else
   begin
   CheckBoxOnline.Checked:=LTCPServer.Listen(SpinEditPortServer.Value);
   CheckBoxOffline.Checked:=false;
   //starte Server Sender
   //LTCPServerSender.Connect('127.0.0.1',SpinEditPortServer.Value);
   ServerMessages.Clear;
   ServerMessages.Lines.Add('- Server online -');
   ServerMessages.Lines.Add('- Client-Modus deaktiviert -');
   GroupBoxClient.Enabled:=false;
   end;
end;

//Server stoppen
procedure TForm1.ButtonStopClick(Sender: TObject);
begin
   if CheckBoxOffline.Checked then
      ServerMessages.Lines.Add('Server bereits offline')
   else
   begin
   CheckBoxOffline.Checked:=true;
   CheckBoxOnline.Checked:=false;
   LTCPServer.Disconnect(true);
   ServerMessages.Lines.Add('- Server offline -');
   ServerMessages.Lines.Add('- Client Modus freigegeben -');
   GroupBoxClient.Enabled:=true;
   end;
end;

//Server hat Verbindung mit Client aufgebaut
procedure TForm1.LTCPServerAccept(aSocket: TLSocket);
begin
   if not(aSocket.LocalAddress='127.0.0.1') then
   LTCPServer.SendMessage('Server: Willkommen '+aSocket.LocalAddress);
end;

//Server empfängt Nachricht
procedure TForm1.LTCPServerReceive(aSocket: TLSocket);
var EinNachricht:string;
begin
   begin
   aSocket.GetMessage(EinNachricht);
   MemoChatWindow.Lines.Add(EinNachricht);
   LTCPServer.IterReset;
      while (LTCPServer.IterNext=true)do
            LTCPServer.SendMessage(EinNachricht,LTCPServer.Iterator);
   end;
end;

//Server bekommt Meldung dass Client sich abmeldet
procedure TForm1.LTCPServerDisconnect(aSocket: TLSocket);
begin
  ServerMessages.Lines.Add('Ein Teilnehmer hat die Verbindung getrennt.');
  LTCPServer.IterReset;
      while (LTCPServer.IterNext=true)do
            LTCPServer.SendMessage('Ein Teilnehmer hat die Verbindung getrennt.'
            ,LTCPServer.Iterator);
end;

//Fehlermeldungen Server
procedure TForm1.LTCPServerError(const msg: string; aSocket: TLSocket);
begin
  ServerMessages.Lines.Add('Server: error:'+msg);
end;




                 {__Client__}

//Client startet Verbindung mit Server
procedure TForm1.ButtonConnectClick(Sender: TObject);
var Nickname:integer;
begin
  if EditNickname.Text='' then
   begin
        Nickname:=MessageDlg('Kein Nickname gesetzt',mtWarning,mbOKCancel,1);
   end;
   LTCPClient.Connect(EditIPAdress.Text,SpinEditPort.Value);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MemoChatWindow.Clear;
end;



//Client hat Verbindung mit Server aufgebaut
procedure TForm1.LTCPClientConnect(aSocket: TLSocket);
begin
  CheckBoxConnection.Checked:=true;
  MemoChatWindow.Lines.Add('Verbindung mit Server '+aSocket.LocalAddress+
  ' hergestellt.');
  ClientSavedServerIP:=aSocket.LocalAddress;

end;


//Client sendet Nachricht
procedure TForm1.ButtonsendmessageClick(Sender: TObject);
begin
   if(EditMessage.text<>'') then
      LTCPClient.SendMessage(EditNickname.text+': '+EditMessage.text);
   EditMessage.Clear;
end;

//Client stoppt Verbindung mit Server
procedure TForm1.ButtonDisconnectClick(Sender: TObject);
begin
   MemoChatWindow.Lines.Add('Trenne verbindung mit Server '+ClientSavedServerIP);
   LTCPClient.Disconnect(true);
   MemoChatWindow.Lines.Add('Verbindung mit Server '+ClientSavedServerIP+' getrennt.');
   GroupBoxClient.Enabled:=true;
   CheckBoxConnection.Checked:=false;
end;

//Client hat Verbindung mit Server gestoppt
procedure TForm1.LTCPClientDisconnect(aSocket: TLSocket);
begin
  MemoChatWindow.Lines.Add('Verbindung mit Server '+ClientSavedServerIP+' getrennt.');
  GroupBoxClient.Enabled:=true;
  CheckBoxConnection.Checked:=false;
end;
//Client empfängt Nachricht
procedure TForm1.LTCPClientReceive(aSocket: TLSocket);
var EingangNachricht:string;
begin
  aSocket.GetMessage(EingangNachricht);
  MemoChatWindow.Lines.Add(EingangNachricht);
end;











end.
