mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-05-16 20:42:31 +02:00
155 lines
3.6 KiB
ObjectPascal
155 lines
3.6 KiB
ObjectPascal
program clientapp;
|
|
|
|
{$IFDEF WINDOWS}
|
|
{$APPTYPE CONSOLE}
|
|
{$ENDIF}
|
|
{$mode objfpc}{$H+}
|
|
|
|
uses
|
|
custapp, Classes, SysUtils, enet, uenetclass;
|
|
|
|
type
|
|
|
|
{ TClientApplication }
|
|
|
|
TClientApplication = class(TCustomApplication)
|
|
Private
|
|
myClient: TENetClass;
|
|
procedure DoConnect;
|
|
procedure OnConnect(const Event:ENetEvent);
|
|
procedure OnReceive(const Event:ENetEvent; var BroadcastMsg : Boolean; var BroadcastChannel : Byte);
|
|
procedure ProcessLoop;
|
|
procedure SendMessage(AMessage: String);
|
|
procedure WriteHelp;
|
|
Protected
|
|
Procedure DoRun; override;
|
|
public
|
|
Constructor Create(AOWner : TComponent); override;
|
|
Destructor Destroy; override;
|
|
end;
|
|
|
|
Var
|
|
Application : TClientApplication;
|
|
|
|
constructor TClientApplication.Create(AOWner: TComponent);
|
|
|
|
begin
|
|
INherited;
|
|
StopOnException:=True;
|
|
myClient := TENetClass.Create(30000,False);
|
|
myClient.MessageTimeout:=100;
|
|
myClient.OnReceive:=@OnReceive;
|
|
myClient.OnConnect:=@OnConnect;
|
|
myClient.OnDisconnect:=@OnConnect;
|
|
end;
|
|
|
|
destructor TClientApplication.Destroy;
|
|
begin
|
|
myClient.Free;
|
|
Inherited;
|
|
end;
|
|
|
|
procedure TClientApplication.SendMessage(AMessage : String);
|
|
begin
|
|
myClient.BroadcastMsg(1,PChar(AMessage),Length(AMessage)+1,[ENetPacketReliable]);
|
|
end;
|
|
|
|
procedure TClientApplication.ProcessLoop;
|
|
begin
|
|
myClient.ProcessMsg;
|
|
end;
|
|
|
|
procedure TClientApplication.DoConnect;
|
|
|
|
Var
|
|
H : String;
|
|
P : Integer;
|
|
begin
|
|
H:=GetOptionValue('H','host');
|
|
if (H='') then
|
|
H:='localhost';
|
|
P:=StrToIntDef(GetOptionValue('p','port'),0);
|
|
if P=0 then
|
|
P:=30000;
|
|
myClient.Connect(H,P);
|
|
end;
|
|
|
|
procedure TClientApplication.OnConnect(const Event: ENetEvent);
|
|
begin
|
|
if Event.kind=ENET_EVENT_TYPE_CONNECT then
|
|
Writeln('Connected')
|
|
else
|
|
Writeln('Disconnected');
|
|
end;
|
|
|
|
procedure TClientApplication.OnReceive(const Event: ENetEvent; var BroadcastMsg: Boolean;
|
|
var BroadcastChannel: Byte);
|
|
var
|
|
msg : string;
|
|
begin
|
|
msg := StrPas(PChar(Event.packet^.data));
|
|
Writeln('Received : "',Msg,'"');
|
|
end;
|
|
|
|
procedure TClientApplication.WriteHelp;
|
|
|
|
begin
|
|
Writeln('Usage ',ExtractFileName(Self.ExeName),' [options]');
|
|
Writeln('Where options is one or more of');
|
|
Writeln('-h --help This message');
|
|
Writeln('-H --host=hostname Hostname to connect to (default : localhost)');
|
|
Writeln('-p --port=portno Port to connect to (default 30000)');
|
|
Writeln('-p --port=portno Port to connect to (default 30000)');
|
|
Writeln('-m --message=msg Message to send to server (none means no message is sent)');
|
|
Writeln('-c --messagecount=N Number of times the message should be sent');
|
|
Writeln('-P --pingcout=N Number of times the server should be pinged. (default 0)');
|
|
Writeln('-c --messagecount=N Number of times the message should be sent (default 1)');
|
|
end;
|
|
|
|
procedure TClientApplication.DoRun;
|
|
Var
|
|
I,PingCount,MessageCount : Integer;
|
|
Msg : String;
|
|
begin
|
|
if HasOption('h','help') then
|
|
begin
|
|
WriteHelp;
|
|
Terminate;
|
|
exit;
|
|
end;
|
|
DoConnect;
|
|
PingCount:=StrToIntDef(GetOptionValue('P','pingcount'),0);
|
|
if PingCount>0 then
|
|
begin
|
|
Writeln('Pinging server');
|
|
For I:=1 to PingCount do
|
|
begin
|
|
myClient.Ping;
|
|
ProcessLoop;
|
|
end;
|
|
end;
|
|
Msg:=GetOptionValue('m','message');
|
|
if (Msg<>'') then
|
|
begin
|
|
MessageCount:=StrToIntDef(GetOptionValue('c','messagecount'),1);
|
|
Writeln('Sending message to server (count:',MessageCount,')');
|
|
For I:=1 to MessageCount do
|
|
begin
|
|
SendMessage(Msg+' (iteration : '+IntToStr(i)+')');
|
|
ProcessLoop;
|
|
end;
|
|
end;
|
|
Terminate;
|
|
end;
|
|
|
|
begin
|
|
Application:=TClientApplication.Create(Nil);
|
|
try
|
|
Application.Initialize;
|
|
Application.Run;
|
|
finally
|
|
Application.Free;
|
|
end;
|
|
end.
|
|
|