The project-file:
[pascal]
program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
[/pascal]

The Form:
[pascal]
object Form1: TForm1
Left = 221
Top = 134
Width = 747
Height = 485
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 232
Top = 16
Width = 32
Height = 13
Caption = 'Label1'
end
object ClientBtn: TButton
Left = 16
Top = 8
Width = 75
Height = 25
Caption = 'ClientBtn'
TabOrder = 0
OnClick = ClientBtnClick
end
object ClientLog: TListBox
Left = 16
Top = 40
Width = 353
Height = 393
ItemHeight = 13
TabOrder = 1
end
object ServerLog: TListBox
Left = 384
Top = 40
Width = 337
Height = 393
ItemHeight = 13
TabOrder = 2
end
object ServerBtn: TButton
Left = 384
Top = 8
Width = 75
Height = 25
Caption = 'ServerBtn'
TabOrder = 3
OnClick = ServerBtnClick
end
object ClientSocket: TClientSocket
Active = False
ClientType = ctNonBlocking
Host = 'localhost'
Port = 2018
OnLookup = ClientSocketLookup
OnConnecting = ClientSocketConnecting
OnConnect = ClientSocketConnect
OnDisconnect = ClientSocketDisconnect
OnRead = ClientSocketRead
OnWrite = ClientSocketWrite
OnError = ClientSocketError
Left = 104
Top = 8
end
object ServerSocket: TServerSocket
Active = False
Port = 2018
ServerType = stNonBlocking
OnListen = ServerSocketListen
OnAccept = ServerSocketAccept
OnGetThread = ServerSocketGetThread
OnGetSocket = ServerSocketGetSocket
OnThreadStart = ServerSocketThreadStart
OnThreadEnd = ServerSocketThreadEnd
OnClientConnect = ServerSocketClientConnect
OnClientDisconnect = ServerSocketClientDisconnect
OnClientRead = ServerSocketClientRead
OnClientWrite = ServerSocketClientWrite
OnClientError = ServerSocketClientError
Left = 472
Top = 8
end
object ClientTimer: TTimer
Enabled = False
Interval = 1
OnTimer = ClientTimerTimer
Left = 136
Top = 8
end
object Timer1: TTimer
OnTimer = Timer1Timer
Left = 280
Top = 8
end
end
[/pascal]


The Unit:
[pascal]
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp, ExtCtrls;

type
TForm1 = class(TForm)
ClientBtn: TButton;
ClientLog: TListBox;
ClientSocket: TClientSocket;
ServerSocket: TServerSocket;
ServerLog: TListBox;
ServerBtn: TButton;
ClientTimer: TTimer;
Label1: TLabel;
Timer1: TTimer;
procedure ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocketConnecting(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocketLookup(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocketWrite(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientBtnClick(Sender: TObject);
procedure ServerBtnClick(Sender: TObject);
procedure ServerSocketAccept(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure ServerSocketGetSocket(Sender: TObject; Socket: Integer;
var ClientSocket: TServerClientWinSocket);
procedure ServerSocketGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
procedure ServerSocketListen(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketThreadEnd(Sender: TObject;
Thread: TServerClientThread);
procedure ServerSocketThreadStart(Sender: TObject;
Thread: TServerClientThread);
procedure ClientTimerTimer(Sender: TObject);
procedure ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientWrite(Sender: TObject;
Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);

{ Private-Deklarationen }
public
{ Public-Deklarationen }
ServerRecvBuf,
ClientRecvBuf : String;
Packets : Integer;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ClientLog.Items.Add('Connect '+
Socket.RemoteAddress+' '+
IntToStr(Socket.RemotePort));
end;

procedure TForm1.ClientSocketConnecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
ClientLog.Items.Add('Connecting '+
Socket.RemoteAddress+' '+
IntToStr(Socket.RemotePort));
end;

procedure TForm1.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ClientLog.Items.Add('Disconnect '+
Socket.RemoteAddress+' '+
IntToStr(Socket.RemotePort));
end;

procedure TForm1.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ClientLog.Items.Add('Error '+
Socket.RemoteAddress+' '+
IntToStr(Socket.RemotePort)+' '+
IntToStr(ErrorCode));
end;

procedure TForm1.ClientSocketLookup(Sender: TObject;
Socket: TCustomWinSocket);
begin
ClientLog.Items.Add('LookUp '+
Socket.RemoteAddress+' '+
IntToStr(Socket.RemotePort));
end;

procedure TForm1.ClientBtnClick(Sender: TObject);
begin
ClientSocket.Active := not ClientSocket.Active;
ClientTimer.Enabled := not ClientTimer.Enabled;
end;

procedure TForm1.ServerBtnClick(Sender: TObject);
begin
ServerSocket.Active := not ServerSocket.Active;
end;

procedure TForm1.ServerSocketAccept(Sender: TObject;
Socket: TCustomWinSocket);
begin
ServerLog.Items.Add('Accept '+
Socket.RemoteAddress+' '+
IntToStr(Socket.RemotePort));
end;

procedure TForm1.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ServerLog.Items.Add('Connect '+
Socket.RemoteAddress+' '+
IntToStr(Socket.RemotePort));

end;

procedure TForm1.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ServerLog.Items.Add('Disconnect '+
Socket.RemoteAddress+' '+
IntToStr(Socket.RemotePort));
end;

procedure TForm1.ServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ServerLog.Items.Add('Error '+
Socket.RemoteAddress+' '+
IntToStr(Socket.RemotePort)+' '+
IntToStr(ErrorCode));
end;

procedure TForm1.ServerSocketGetSocket(Sender: TObject; Socket: Integer;
var ClientSocket: TServerClientWinSocket);
begin
if Assigned(ClientSocket) then
ServerLog.Items.Add('GetSocket '+
ClientSocket.RemoteAddress+' '+
IntToStr(ClientSocket.RemotePort))
else
ServerLog.Items.Add('GetSocket');

end;

procedure TForm1.ServerSocketGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
if Assigned(SocketThread) then
ServerLog.Items.Add('GetThread '+
ClientSocket.RemoteAddress+' '+
IntToStr(ClientSocket.RemotePort)+' '+
IntToStr(SocketThread.Handle))
else
ServerLog.Items.Add('GetThread '+
ClientSocket.RemoteAddress+' '+
IntToStr(ClientSocket.RemotePort));
end;

procedure TForm1.ServerSocketListen(Sender: TObject;
Socket: TCustomWinSocket);
begin
ServerLog.Items.Add('Listen '+
Socket.LocalAddress+' '+
IntToStr(Socket.LocalPort));
end;

procedure TForm1.ServerSocketThreadEnd(Sender: TObject;
Thread: TServerClientThread);
begin
ServerLog.Items.Add('EndThread '+
IntToStr(Thread.Handle));
end;

procedure TForm1.ServerSocketThreadStart(Sender: TObject;
Thread: TServerClientThread);
begin
ServerLog.Items.Add('StartThread '+
IntToStr(Thread.Handle));
end;

//------------------------------------------

procedure TForm1.ClientTimerTimer(Sender: TObject);
begin
//Send the message. Use the #13 (CR) as Message separator
ClientSocket.Socket.SendText('MyText'#13);
end;

procedure TForm1.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
Data : String;
iPos : Integer;
//iCount : Integer;
begin
//Receive the whole buffer
ClientRecvBuf := ClientRecvBuf + Socket.ReceiveText;

//Read messages till buffer is empty
//iCount:=1;
repeat
iPos := 1;
while iPos<length(ClientRecvBuf) do
begin
//Check for seperator char
if ClientRecvBuf[iPos]=#13 then break;
inc(iPos);
end;

Data := Copy(ClientRecvBuf,1,iPos-1);
Delete(ClientRecvBuf,1,iPos);
{
ClientLog.Items.Add('Read '+IntToStr(iCount)+' '+
Socket.RemoteAddress+' '+
IntToStr(Socket.RemotePort)+' '+
Data);
inc(iCount);
}
inc(Packets);

until ClientRecvBuf='';
end;

procedure TForm1.ClientSocketWrite(Sender: TObject;
Socket: TCustomWinSocket);
begin
{
ClientLog.Items.Add('Write '+
Socket.RemoteAddress+' '+
IntToStr(Socket.RemotePort));
}
end;

procedure TForm1.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
Data : String;
iPos : Integer;
begin
//Receive the whole buffer
ServerRecvBuf := ServerRecvBuf + Socket.ReceiveText;

//Read messages till buffer is empty
repeat
iPos := 1;
while iPos<length(ServerRecvBuf) do
begin
//Check for seperator char
if ServerRecvBuf[iPos]=#13 then break;
inc(iPos);
end;

//Only process data, if Message is complete (last char =#13)
//This is alway true, as long as iPos is not byond the end
//of the Buffer
if iPos<=length(ServerRecvBuf) then
begin
Data := Copy(ServerRecvBuf,1,iPos-1);
Delete(ServerRecvBuf,1,iPos);
{
ServerLog.Items.Add('Read '+
Socket.RemoteAddress+' '+
IntToStr(Socket.RemotePort)+' '+
Data);
}

//Just for randomly generate multiple receives.
If Random(100)=5
then Socket.SendText('ReceivedText'#13'ReceivedText'#13 )
else Socket.SendText('ReceivedText'#13);
end;

until ClientRecvBuf='';

end;

procedure TForm1.ServerSocketClientWrite(Sender: TObject;
Socket: TCustomWinSocket);
begin
ServerLog.Items.Add('Write '+
Socket.RemoteAddress+' '+
IntToStr(Socket.RemotePort));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
Packets := 0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Caption := IntToStr(Packets);
end;

end.
[/pascal]