H
hw123
Unregistered / Unconfirmed
GUEST, unregistred user!
在过程 ClientExecute中须操作MS SQL SERVER上的数据应如何写?
多谢!!!
{ Note: This is a demo application intended to illustrate how to use
the TServerClientThread class in a multi-threaded server application.
This demo requires the TServerSocket component.
This is an example of a very simple "file server". To request a
file simply send the complete path/filename to the server
(ex. c:/autoexec.bat) for a file located on the server machine.
The server will return the entire file to the client within a thread.
This server can accept multiple simultaneous connections each
running in a different thread (as long as the thread cache size
is > the number of concurrent connections).
You can test this server using the Chat Demo that comes with Delphi
(or is available via the Borland web site).
Simply start the Chat client and connect to the server machine (using
it's DNS name). Once connected you can type the name of a file that
exists on the server machine (press Enter to send the request) and it
will be sent to the client and appear in the Chat window.
For example once you have connected type: c:/autoexec.bat<enter>
}
unit main;
interface
uses
Windows, SysUtils, Messages, Classes, Forms, ScktComp, Controls, StdCtrls,
Menus, Mask, Spin, ComCtrls, ExtCtrls;
const
CM_IncCount = WM_USER + 1;
type
TForm1 = class(TForm)
ServerSocket: TServerSocket;
MainMenu: TMainMenu;
File1: TMenuItem;
ActiveItem: TMenuItem;
N1: TMenuItem;
Exit1: TMenuItem;
Panel1: TPanel;
Label1: TLabel;
CacheEdit: TSpinEdit;
Label2: TLabel;
PortEdit: TSpinEdit;
Label3: TLabel;
ThreadCount: TEdit;
Panel2: TPanel;
ListBox1: TListBox;
Panel3: TPanel;
StatusBar1: TStatusBar;
FileCount: TLabel;
procedure ServerSocketGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Exit1Click(Sender: TObject);
procedure PortEditChange(Sender: TObject);
procedure ActiveItemClick(Sender: TObject);
procedure ServerSocketThreadEnd(Sender: TObject;
Thread: TServerClientThread);
procedure ServerSocketThreadStart(Sender: TObject;
Thread: TServerClientThread);
procedure CacheEditChange(Sender: TObject);
protected
procedure CMIncCount(var Msg: TMessage); message CM_IncCount;
public
end;
{ TFileServerThread }
TFileServerThread = class(TServerClientThread)
public
procedure ClientExecute; override;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TFileServerThread }
procedure TFileServerThread.ClientExecute;
var
Data: array[0..1023] of char;
FileName: String;
SocketStream: TWinSocketStream;
begin
while not Terminated and ClientSocket.Connected do
try
SocketStream := TWinSocketStream.Create(ClientSocket, 60000);
try
FillChar(Data, SizeOf(Data), 0);
if SocketStream.Read(Data, SizeOf(Data)) = 0 then
begin
// If we didn't get any data after 60 seconds then close the connection
ClientSocket.Close;
Terminate;
end;
FileName := Data;
if Length(FileName) > 2 then
Delete(FileName, Pos(#13#10, FileName), 2); // Delete #13#10
if FileExists(FileName) and ClientSocket.Connected then
begin
ClientSocket.SendStream(TFileStream.Create(FileName, fmOpenRead or
fmShareCompat or fmShareDenyNone));
// Need to use SendMessage here otherwise S could change
SendMessage(Form1.Listbox1.Handle, LB_ADDSTRING, 0, Integer(PChar(FileName)));
// PostMessage here is OK because we are not relying on any data
PostMessage(Form1.Handle, CM_INCCOUNT, 0, 0);
end;
finally
SocketStream.Free;
end;
except
HandleException;
end;
end;
procedure TForm1.ServerSocketGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
// Create a new thread for connection
SocketThread := TFileServerThread.Create(False, ClientSocket);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CacheEdit.Value := ServerSocket.ThreadCacheSize;
PortEdit.Value := ServerSocket.Port;
FileCount.Caption := '0';
ActiveItemClick(nil);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket.Close;
end;
procedure TForm1.CMIncCount(var Msg: TMessage);
begin
FileCount.Caption := IntToStr(StrToInt(FileCount.Caption) + 1);
end;
procedure TForm1.Exit1Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.PortEditChange(Sender: TObject);
begin
ServerSocket.Port := StrToInt(PortEdit.Text);
end;
procedure TForm1.ActiveItemClick(Sender: TObject);
begin
ServerSocket.Active := not ServerSocket.Active;
ActiveItem.Checked := ServerSocket.Active;
if ServerSocket.Active then
StatusBar1.SimpleText := 'Active'
else
StatusBar1.SimpleText := 'InActive';
end;
procedure TForm1.ServerSocketThreadEnd(Sender: TObject;
Thread: TServerClientThread);
begin
ThreadCount.Text := IntToStr(StrToInt(ThreadCount.Text) - 1);
end;
procedure TForm1.ServerSocketThreadStart(Sender: TObject;
Thread: TServerClientThread);
begin
ThreadCount.Text := IntToStr(StrToInt(ThreadCount.Text) + 1);
end;
procedure TForm1.CacheEditChange(Sender: TObject);
begin
ServerSocket.ThreadCacheSize := CacheEdit.Value;
end;
end.
多谢!!!
{ Note: This is a demo application intended to illustrate how to use
the TServerClientThread class in a multi-threaded server application.
This demo requires the TServerSocket component.
This is an example of a very simple "file server". To request a
file simply send the complete path/filename to the server
(ex. c:/autoexec.bat) for a file located on the server machine.
The server will return the entire file to the client within a thread.
This server can accept multiple simultaneous connections each
running in a different thread (as long as the thread cache size
is > the number of concurrent connections).
You can test this server using the Chat Demo that comes with Delphi
(or is available via the Borland web site).
Simply start the Chat client and connect to the server machine (using
it's DNS name). Once connected you can type the name of a file that
exists on the server machine (press Enter to send the request) and it
will be sent to the client and appear in the Chat window.
For example once you have connected type: c:/autoexec.bat<enter>
}
unit main;
interface
uses
Windows, SysUtils, Messages, Classes, Forms, ScktComp, Controls, StdCtrls,
Menus, Mask, Spin, ComCtrls, ExtCtrls;
const
CM_IncCount = WM_USER + 1;
type
TForm1 = class(TForm)
ServerSocket: TServerSocket;
MainMenu: TMainMenu;
File1: TMenuItem;
ActiveItem: TMenuItem;
N1: TMenuItem;
Exit1: TMenuItem;
Panel1: TPanel;
Label1: TLabel;
CacheEdit: TSpinEdit;
Label2: TLabel;
PortEdit: TSpinEdit;
Label3: TLabel;
ThreadCount: TEdit;
Panel2: TPanel;
ListBox1: TListBox;
Panel3: TPanel;
StatusBar1: TStatusBar;
FileCount: TLabel;
procedure ServerSocketGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Exit1Click(Sender: TObject);
procedure PortEditChange(Sender: TObject);
procedure ActiveItemClick(Sender: TObject);
procedure ServerSocketThreadEnd(Sender: TObject;
Thread: TServerClientThread);
procedure ServerSocketThreadStart(Sender: TObject;
Thread: TServerClientThread);
procedure CacheEditChange(Sender: TObject);
protected
procedure CMIncCount(var Msg: TMessage); message CM_IncCount;
public
end;
{ TFileServerThread }
TFileServerThread = class(TServerClientThread)
public
procedure ClientExecute; override;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TFileServerThread }
procedure TFileServerThread.ClientExecute;
var
Data: array[0..1023] of char;
FileName: String;
SocketStream: TWinSocketStream;
begin
while not Terminated and ClientSocket.Connected do
try
SocketStream := TWinSocketStream.Create(ClientSocket, 60000);
try
FillChar(Data, SizeOf(Data), 0);
if SocketStream.Read(Data, SizeOf(Data)) = 0 then
begin
// If we didn't get any data after 60 seconds then close the connection
ClientSocket.Close;
Terminate;
end;
FileName := Data;
if Length(FileName) > 2 then
Delete(FileName, Pos(#13#10, FileName), 2); // Delete #13#10
if FileExists(FileName) and ClientSocket.Connected then
begin
ClientSocket.SendStream(TFileStream.Create(FileName, fmOpenRead or
fmShareCompat or fmShareDenyNone));
// Need to use SendMessage here otherwise S could change
SendMessage(Form1.Listbox1.Handle, LB_ADDSTRING, 0, Integer(PChar(FileName)));
// PostMessage here is OK because we are not relying on any data
PostMessage(Form1.Handle, CM_INCCOUNT, 0, 0);
end;
finally
SocketStream.Free;
end;
except
HandleException;
end;
end;
procedure TForm1.ServerSocketGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
// Create a new thread for connection
SocketThread := TFileServerThread.Create(False, ClientSocket);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CacheEdit.Value := ServerSocket.ThreadCacheSize;
PortEdit.Value := ServerSocket.Port;
FileCount.Caption := '0';
ActiveItemClick(nil);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket.Close;
end;
procedure TForm1.CMIncCount(var Msg: TMessage);
begin
FileCount.Caption := IntToStr(StrToInt(FileCount.Caption) + 1);
end;
procedure TForm1.Exit1Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.PortEditChange(Sender: TObject);
begin
ServerSocket.Port := StrToInt(PortEdit.Text);
end;
procedure TForm1.ActiveItemClick(Sender: TObject);
begin
ServerSocket.Active := not ServerSocket.Active;
ActiveItem.Checked := ServerSocket.Active;
if ServerSocket.Active then
StatusBar1.SimpleText := 'Active'
else
StatusBar1.SimpleText := 'InActive';
end;
procedure TForm1.ServerSocketThreadEnd(Sender: TObject;
Thread: TServerClientThread);
begin
ThreadCount.Text := IntToStr(StrToInt(ThreadCount.Text) - 1);
end;
procedure TForm1.ServerSocketThreadStart(Sender: TObject;
Thread: TServerClientThread);
begin
ThreadCount.Text := IntToStr(StrToInt(ThreadCount.Text) + 1);
end;
procedure TForm1.CacheEditChange(Sender: TObject);
begin
ServerSocket.ThreadCacheSize := CacheEdit.Value;
end;
end.