ServerForm.pas
上传用户:fh681027
上传日期:2022-07-23
资源大小:1959k
文件大小:5k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit ServerForm;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   ScktComp, StdCtrls, Grids, DBGrids, Db, DBTables, ComCtrls;
  6. type
  7.   TForm1 = class(TForm)
  8.     PageControl1: TPageControl;
  9.     TabSheet1: TTabSheet;
  10.     TabSheet2: TTabSheet;
  11.     Label1: TLabel;
  12.     lbClients: TListBox;
  13.     lbLog: TListBox;
  14.     ServerSocket1: TServerSocket;
  15.     Table1: TTable;
  16.     DataSource1: TDataSource;
  17.     DBGrid1: TDBGrid;
  18.     Table1Company: TStringField;
  19.     Table1CompID: TFloatField;
  20.     Table1Address: TStringField;
  21.     Table1State: TStringField;
  22.     Table1Country: TStringField;
  23.     Table1Email: TStringField;
  24.     Table1Contact: TStringField;
  25.     Table1LoggedBy: TStringField;
  26.     Table1LoggetOn: TDateField;
  27.     procedure ServerSocket1ClientConnect(Sender: TObject;
  28.       Socket: TCustomWinSocket);
  29.     procedure ServerSocket1ClientDisconnect(Sender: TObject;
  30.       Socket: TCustomWinSocket);
  31.     procedure FormCreate(Sender: TObject);
  32.     procedure ServerSocket1GetThread(Sender: TObject;
  33.       ClientSocket: TServerClientWinSocket;
  34.       var SocketThread: TServerClientThread);
  35.     procedure ServerSocket1Accept(Sender: TObject;
  36.       Socket: TCustomWinSocket);
  37.   private
  38.     { Private declarations }
  39.   end;
  40. var
  41.   Form1: TForm1;
  42. implementation
  43. type
  44.   TDbServerThread = class(TServerClientThread)
  45.   private
  46.     strCommand: string;
  47.     strFeedback: string;
  48.   public
  49.     procedure ClientExecute; override;
  50.     procedure Log;
  51.     procedure LogFeedback;
  52.     procedure AddRecord;
  53.   end;
  54. var
  55.   ID: Integer;
  56. {$R *.DFM}
  57. procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  58.   Socket: TCustomWinSocket);
  59. begin
  60.   lbLog.Items.Add ('Connected: ' +
  61.     Socket.RemoteHost + ' (' + Socket.RemoteAddress + ')' );
  62. end;
  63. procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  64.   Socket: TCustomWinSocket);
  65. begin
  66.   lbLog.Items.Add ('Disconnected: ' +
  67.     Socket.RemoteHost + ' (' + Socket.RemoteAddress + ')' );
  68. end;
  69. procedure TForm1.FormCreate(Sender: TObject);
  70. begin
  71.   // use a table in the current directory
  72.   Table1.DatabaseName :=
  73.     ExtractFilePath (Application.ExeName);
  74.   // create the table, if it doens't exist
  75.   if not Table1.Exists then
  76.     Table1.CreateTable;
  77.   Table1.Active := True;
  78.   // setup first ID
  79. end;
  80. { TDbServerThread }
  81. procedure TDbServerThread.Log;
  82. begin
  83.   Form1.lbLog.Items.Add ('Request: ' + strCommand);
  84. end;
  85. procedure TDbServerThread.LogFeedback;
  86. begin
  87.   Form1.lbLog.Items.Add ('Response: ' + strFeedback);
  88. end;
  89. procedure TDbServerThread.AddRecord;
  90. var
  91.   Data: TStringList;
  92.   I: Integer;
  93. begin
  94.   Data := TStringList.Create;
  95.   try
  96.     Data.Text := strCommand;
  97.     // new record
  98.     Form1.Table1.Insert;
  99.     // set the fields using the strings
  100.     for I := 0 to Form1.Table1.FieldCount - 1 do
  101.       Form1.Table1.Fields [I].AsString :=
  102.         Data.Values [Form1.Table1.Fields[I].FieldName];
  103.     // complete with random ID, sender, and date
  104.     Form1.Table1CompID.AsInteger := ID;
  105.     Inc(ID);
  106.     Form1.Table1LoggedBy.AsString := ClientSocket.RemoteAddress;
  107.     Form1.Table1LoggetOn.AsDateTime := Date;
  108.     Form1.Table1.Post;
  109.     // get the value to return
  110.     strFeedback := Form1.Table1CompID.AsString;
  111.   finally
  112.     Data.Free;
  113.   end;
  114. end;
  115. procedure TDbServerThread.ClientExecute;
  116. var
  117.   Stream: TWinSocketStream;
  118.   Buffer, strIn: string;
  119.   nRead: Integer;
  120. begin
  121.   // keep going
  122.   Stream := TWinSocketStream.Create(ClientSocket, 5000);
  123.   try
  124.     while not Terminated and ClientSocket.Connected do
  125.     begin
  126.       // initialize (thread might be reused)
  127.       Buffer := '';
  128.       strIn := '';
  129.       SetLength(Buffer, 64);
  130.       repeat
  131.         nRead := Stream.Read(Buffer[1], 64);
  132.         if nRead = 0 then
  133.         begin
  134.           ClientSocket.Close;
  135.           Break;
  136.         end;
  137.         SetLength (Buffer, nRead);
  138.         StrIn := StrIn + Buffer;
  139.       until (Pos(#10#13'.'#10#13, Buffer) > 0);
  140.       if strIn = '' then
  141.         Continue // keep going
  142.       else
  143.       begin
  144.         // handle the request, if anything arrived
  145.         StrCommand := Copy (strIn, 1, Pos (#10#13'.'#10#13, strIn) -1);
  146.         Synchronize(Log);
  147.         Synchronize(AddRecord);
  148.         // send results back
  149.         Synchronize(LogFeedback);
  150.         Stream.Write(strFeedback[1], Length (strFeedback));
  151.       end;
  152.     end;
  153.   finally
  154.     Stream.Free;
  155.   end;
  156. end;
  157. procedure TForm1.ServerSocket1GetThread(Sender: TObject;
  158.   ClientSocket: TServerClientWinSocket;
  159.   var SocketThread: TServerClientThread);
  160. begin
  161.   lbLog.Items.Add ('GetThread: ' +
  162.     ClientSocket.RemoteHost + ' (' + ClientSocket.RemoteAddress + ')' );
  163.   SocketThread := TDbServerThread.Create(False, ClientSocket);
  164. end;
  165. procedure TForm1.ServerSocket1Accept(Sender: TObject;
  166.   Socket: TCustomWinSocket);
  167. begin
  168.   lbLog.Items.Add ('Accepted: ' +
  169.     Socket.RemoteHost + ' (' + Socket.RemoteAddress + ')' );
  170. end;
  171. initialization
  172.   // Setup first ID for this session
  173.   ID := GetTickCount;
  174. end.