Unit1.pas 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. unit Unit1;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, StdCtrls,HPSocketSDKUnit, ExtCtrls;
  6. type
  7. TForm1 = class(TForm)
  8. lst: TListBox;
  9. Label1: TLabel;
  10. Edit1: TEdit;
  11. Label2: TLabel;
  12. Edit2: TEdit;
  13. btn1: TButton;
  14. btn2: TButton;
  15. Label3: TLabel;
  16. Label4: TLabel;
  17. Timer1: TTimer;
  18. procedure FormCreate(Sender: TObject);
  19. procedure FormDestroy(Sender: TObject);
  20. procedure btn1Click(Sender: TObject);
  21. procedure btn2Click(Sender: TObject);
  22. procedure Timer1Timer(Sender: TObject);
  23. private
  24. { Private declarations }
  25. public
  26. { Public declarations }
  27. end;
  28. Pserver = Record
  29. DListener : Integer;
  30. DServer : Integer;
  31. end;
  32. var
  33. Form1: TForm1;
  34. PPserver: pserver;
  35. cs:TRTLCriticalSection;
  36. implementation
  37. {$R *.dfm}
  38. procedure AddMsg(str: string);
  39. begin
  40. EnterCriticalSection(CS);
  41. Form1.lst.Items.Add('==> '+str);
  42. LeaveCriticalSection(CS);
  43. end;
  44. function OnPrepareListen(soListen: Pointer): En_HP_HandleResult; stdcall;
  45. begin
  46. AddMsg('准备监听 -> ' + inttostr(Integer(solisten)));
  47. Result := HP_HR_OK;
  48. end;
  49. function OnAccept(dwConnId: DWORD; pClient: Pointer): En_HP_HandleResult; stdcall;
  50. var
  51. ip: array [0 .. 40] of WideChar;
  52. ipLength: Integer;
  53. port: Word;
  54. begin
  55. ipLength := 40;
  56. if HP_Server_GetRemoteAddress(PPserver.DServer, dwConnId, ip, @ipLength, @port) then
  57. begin
  58. AddMsg('连接上线 -> '+ string(ip) +':'+ inttostr(port));
  59. end
  60. else
  61. begin
  62. AddMsg('取连接信息失败 -> ' + inttostr(dwConnId));
  63. end;
  64. Result := HP_HR_OK;
  65. end;
  66. function OnSend(dwConnId: DWORD; const pData: Pointer; iLength: Integer): En_HP_HandleResult; stdcall;
  67. begin
  68. AddMsg('发送数据 -> ' + inttostr(iLength) + ' bytes');
  69. Result := HP_HR_OK;
  70. end;
  71. function OnReceive(dwConnID: HP_CONNID;const pData: Pointer; iLength: Integer): En_HP_HandleResult; stdcall;
  72. begin
  73. AddMsg('收到数据 -> ' + inttostr(iLength) + ' bytes');
  74. Result:= HP_HR_OK;
  75. end;
  76. function OnCloseConn(dwConnId: DWORD; enOperation: En_HP_SocketOperation; iErrorCode: Integer ): En_HP_HandleResult; stdcall;
  77. begin
  78. AddMsg('连接关闭 -> ' + inttostr(Integer(dwConnId)));
  79. Result := HP_HR_OK;
  80. end;
  81. function OnShutdown(): En_HP_HandleResult; stdcall;
  82. begin
  83. AddMsg('服务关闭 -> ');
  84. Result:= HP_HR_OK;
  85. end;
  86. procedure TForm1.FormCreate(Sender: TObject);
  87. begin
  88. // 创建监听器对象
  89. PPserver.DListener:= Create_HP_TcpServerListener();
  90. // 创建 Socket 对象
  91. PPserver.DServer := Create_HP_TcpServer(PPserver.DListener);
  92. // 设置 Socket 监听器回调函数
  93. HP_Set_FN_Server_OnPrepareListen(PPserver.DListener, OnPrepareListen);
  94. HP_Set_FN_Server_OnAccept(PPserver.DListener, OnAccept);
  95. HP_Set_FN_Server_OnSend(PPserver.DListener, OnSend);
  96. HP_Set_FN_Server_OnReceive(PPserver.DListener, OnReceive);
  97. HP_Set_FN_Server_OnClose(PPserver.DListener, OnCloseConn);
  98. HP_Set_FN_Server_OnShutdown(PPserver.DListener, OnShutdown);
  99. // 设置HP模式为并发发送模式
  100. HP_Server_SetSendPolicy(PPserver.DServer, HP_SP_DIRECT);
  101. //设置工作线程
  102. HP_Server_SetWorkerThreadCount(PPserver.DServer, 30);
  103. //初始化临界区
  104. InitializeCriticalSection(CS);
  105. AddMsg('系统初始化完成');
  106. end;
  107. procedure TForm1.FormDestroy(Sender: TObject);
  108. begin
  109. DeleteCriticalSection(CS); //删除临界区
  110. end;
  111. procedure TForm1.btn1Click(Sender: TObject);
  112. var
  113. Ip:WideString;
  114. Port:Word;
  115. errorId: En_HP_SocketError;
  116. errorMsg: WideString;
  117. begin
  118. Ip := EDIT1.Text;
  119. Port := StrToInt(Edit2.TEXT);
  120. if HP_Server_Start(PPserver.DServer, ip, port) then
  121. begin
  122. AddMsg(Format('服务启动成功 -> (%s:%d)', [ip, port]));
  123. end
  124. else
  125. begin
  126. errorId := HP_Server_GetLastError(PPserver.DServer);
  127. errorMsg := HP_Server_GetLastErrorDesc(PPserver.DServer);
  128. AddMsg(Format('服务启动失败 -> %s(%d)', [errorMsg, Integer(errorId)]));
  129. end;
  130. end;
  131. procedure TForm1.btn2Click(Sender: TObject);
  132. begin
  133. if HP_Server_Stop(PPserver.DServer) then
  134. begin
  135. AddMsg('服务停止成功 -> ');
  136. end
  137. else
  138. begin
  139. AddMsg('服务停止失败 -> ');
  140. end;
  141. end;
  142. procedure TForm1.Timer1Timer(Sender: TObject);
  143. var
  144. Count:Integer;
  145. begin
  146. Count:= HP_Server_GetConnectionCount(PPserver.DServer);
  147. Label4.Caption:= IntToStr(Count);
  148. end;
  149. end.