123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- 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.
|