Blue
Red
Green
Orange
Voilet
Slate
Dark

请将DELPHI编写的FILESERVER 转换为C++BUILDER3。0 !! 高分(200分)

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.

 

曹晓钢

Unregistered / Unconfirmed
GUEST, unregistred user!
C++ builder不是可以直接编译delphi的代码吗?干吗要转?
 
W

wuyi

Unregistered / Unconfirmed
GUEST, unregistred user!
>>在过程 ClientExecute中须操作MS SQL SERVER上的数据应如何写?

什么意思? 你的数据是放在文件中的还是MSSQL数据库中?
 
S

sherman

Unregistered / Unconfirmed
GUEST, unregistred user!
我也没有看到有什么问题,hw123,你说说
 
H

hw123

Unregistered / Unconfirmed
GUEST, unregistred user!
曹SIR:
C++ builder直接编译delphi的代码?变量传递、过程互相调用有问题?
wuyi:

In Muti Threads,DB OP IS

procedure THBServerThread.ClientExecute;
var
UniqueNumber: Integer;
Data: array[0..63] of Char; //每次Read读出的数据
Temp: array[0..127] of Char;
ifRecv,Loop: boolean;
SocketStream: TWinSocketStream;
begin
{ Ensure the Query has a unique session and database. A unique
session is required for each thread. Since databases are
session specific it must be unique as well }
UniqueNumber := GetUniqueNumber;
Session.SessionName := Format('%s%x', [Session.Name, UniqueNumber]);
Dm:=TDm1.Create(Application);
Dm.DB.SessionName:=Session.SessionName;
Dm.DB.DatabaseName := Format('HbWeb%x', [UniqueNumber]);
Dm.DB.Connected:=True;
Dm.Qry.SessionName:=Dm.DB.SessionName;
Dm.Qry.DatabaseName:=Dm.DB.DatabaseName;
while not Terminated and ClientSocket.Connected do
try
SocketStream := TWinSocketStream.Create(ClientSocket, 60000);
try
Loop:=True;
ifRecv:=False;
FillChar(Temp,SizeOf(Temp),0);
while Loop do begin
//这里有一点奇怪,第一次Read时总是只读一个byte,Why?
FillChar(Data, SizeOf(Data), 0);
if SocketStream.WaitForData(60000) then begin
if SocketStream.Read(Data, SizeOf(Data)) = 0 then begin
ClientSocket.Close;
Terminate;
Break;
end else
StrLCat(Temp,Data,128);
if not (StrPos(Temp,#13#10)=nil) then begin
Loop:=False;
ifRecv:=True;
end;
end
else begin // if SocketStream.WaitForData(60000) then
ClientSocket.Close;
Terminate;
Loop:=False;
ifRecv:=False;
end;
end; //while Loop do
if ifRecv and ClientSocket.Connected then
HandleRequest(Temp); //进行相应处理
finally
SocketStream.Free;
end;
except
//HandleException;
Dm.Free;
Terminate;
end;
end;

 
N

norton

Unregistered / Unconfirmed
GUEST, unregistred user!
for hw123:
我也正在利用上面的程序发送文件,但发现发送文本文件没有问题,
但发送二进制文件,用sendstream有问题!,大家不妨探讨一下。
 
T

Town

Unregistered / Unconfirmed
GUEST, unregistred user!
追踪此问题
 
H

hw123

Unregistered / Unconfirmed
GUEST, unregistred user!
速度太慢 很久没有来这里 现在给大家加分 谢谢大家
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
488
import
I
I
回复
0
查看
611
import
I
顶部 底部