serverapp.pp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. program serverapp;
  2. {$mode objfpc}{$H+}
  3. {$IFDEF WINDOWS}
  4. {$APPTYPE CONSOLE}
  5. {$ENDIF}
  6. uses
  7. Classes, SysUtils, enet, uenetclass, custapp;
  8. type
  9. { TServerApplication }
  10. TServerApplication = class(TCustomApplication)
  11. Private
  12. myServer : TENetClass;
  13. FIdleCount : Int64;
  14. procedure ProcessLoop;
  15. procedure OnConnect(const Event:ENetEvent);
  16. procedure OnReceive(const Event:ENetEvent; var BroadcastMsg : Boolean; var BroadcastChannel : Byte);
  17. procedure ResetIdle;
  18. procedure StartServer(APort, ATimeout: Integer);
  19. procedure WriteHelp;
  20. protected
  21. Procedure DoRun; override;
  22. public
  23. constructor Create(AOwner : TComponent); override;
  24. Destructor Destroy; override;
  25. { public declarations }
  26. end;
  27. constructor TServerApplication.Create(AOwner: TComponent);
  28. begin
  29. Inherited;
  30. StopOnException:=True;
  31. end;
  32. procedure TServerApplication.StartServer(APort,ATimeout : Integer);
  33. begin
  34. myServer := TENetClass.Create(APort,True);
  35. myServer.OnReceive:=@OnReceive;
  36. myServer.OnConnect:=@OnConnect;
  37. myServer.OnDisconnect:=@OnConnect;
  38. myServer.OnNone:=@OnConnect;
  39. myServer.MessageTimeout:=ATimeOut; // ideal for application idle?
  40. myServer.InitHost;
  41. end;
  42. procedure TServerApplication.WriteHelp;
  43. begin
  44. Writeln('Usage ',ExtractFileName(Self.ExeName),' [options]');
  45. Writeln('Where options is one or more of');
  46. Writeln('-h --help This message');
  47. Writeln('-p --port=portno Port to listen on (default 30000)');
  48. Writeln('-t --timeout=msec Timeout for listening to messages (milliseconds, default 1000)');
  49. end;
  50. procedure TServerApplication.DoRun;
  51. Var
  52. T,P : Integer;
  53. begin
  54. if HasOption('h','help') then
  55. begin
  56. WriteHelp;
  57. Terminate;
  58. exit;
  59. end;
  60. P:=StrToIntDef(GetoptionValue('p','port'),0);
  61. T:=StrToIntDef(GetoptionValue('t','timeout'),0);
  62. if P=0 then
  63. P:=30000;
  64. if t=0 then
  65. T:=1000; // 1 second timeout,
  66. StartServer(P,T);
  67. FIdleCount:=0;
  68. repeat
  69. ProcessLoop;
  70. if FIdleCount=0 then
  71. Write('[idle');
  72. Write('.');
  73. Inc(FIdleCount);
  74. until terminated;
  75. end;
  76. procedure TServerApplication.ProcessLoop;
  77. begin
  78. myServer.ProcessMsg;
  79. end;
  80. destructor TServerApplication.Destroy;
  81. begin
  82. myServer.Free;
  83. end;
  84. procedure TServerApplication.ResetIdle;
  85. begin
  86. if FIdleCount>0 then
  87. Writeln(']');
  88. FIdleCount:=0;
  89. end;
  90. procedure TServerApplication.OnConnect(const Event: ENetEvent);
  91. begin
  92. ResetIdle;
  93. if (Event.Kind=ENet_Event_type_Connect) then
  94. Writeln('Connect on channel : ',Event.channelID,' connected ID ,',Event.peer^.connectID,' (peer : ',Event.peer^.address.host,' port ',Event.peer^.address.port,')')
  95. else if Event.Kind=ENet_Event_type_DisConnect then
  96. Writeln('Disonnect on channel : ',Event.channelID,' connected ID ,',Event.peer^.connectID,' (peer : ',Event.peer^.address.host,' port ',Event.peer^.address.port,')')
  97. else
  98. Writeln('Unspecified connect event');
  99. end;
  100. procedure TServerApplication.OnReceive(const Event: ENetEvent; var BroadcastMsg: Boolean;
  101. var BroadcastChannel: Byte);
  102. var
  103. msg : string;
  104. begin
  105. ResetIdle;
  106. msg := PChar(Event.packet^.data);
  107. Writeln('Received message on channel : ',Event.channelID,' connected ID ,',Event.peer^.connectID,' (peer : ',Event.peer^.address.host,' port ',Event.peer^.address.port,')');
  108. Writeln('Message reads : "',Msg,'"');
  109. end;
  110. Var
  111. Application : TServerApplication;
  112. begin
  113. Application:=TServerApplication.Create(Nil);
  114. try
  115. Application.Initialize;
  116. Application.Run;
  117. finally
  118. Application.Free;
  119. end;
  120. end.