//算了,给个可运行的例子吧。 unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls;type TFileInfo=record FileName:String[128]; FileSize:Int64; end; TGetFileBeginEvent=procedure(var FileName:String) of object; TGetFileOverEvent=procedure of object; TFileServerThread=class(TServerClientThread) private FOnGetFileBegin: TGetFileBeginEvent; FOnGetFileOver: TGetFileOverEvent; public constructor Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket;OnGetFileBegin: TGetFileBeginEvent; OnGetFileOver: TGetFileOverEvent); procedure ClientExecute;override; end; TForm1 = class(TForm) ServerSocket1: TServerSocket; ClientSocket1: TClientSocket; SaveDialog1: TSaveDialog; SendFileBtn: TButton; OpenDialog1: TOpenDialog; procedure FormCreate(Sender: TObject); procedure ServerSocket1GetThread(Sender: TObject; ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread); procedure SendFileBtnClick(Sender: TObject); private { Private declarations } public { Public declarations } procedure OnGetFile(var FileName:String); procedure OnGetFileOver; end;var Form1: TForm1;implementation{$R *.dfm}{ TFileServerThread }constructor TFileServerThread.Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket;OnGetFileBegin: TGetFileBeginEvent; OnGetFileOver: TGetFileOverEvent); begin inherited Create(True,ASocket); Self.FreeOnTerminate:=True; FOnGetFileBegin:=OnGetFileBegin; FOnGetFileOver:=OnGetFileOver; if not CreateSuspended then Resume; end;procedure TFileServerThread.ClientExecute; var Stream:TWinSocketStream; FI:TFileInfo; FS:TFileStream; FileName:String; ReadLen:Integer; Buffer:String; begin Stream:=TWinSocketStream.Create(ClientSocket,6000); SetLength(Buffer,4096); try try while not Terminated and ClientSocket.Connected do begin ReadLen:=0; while not Terminated and ClientSocket.Connected do begin Inc(ReadLen,Stream.Read(Pointer(Integer(@FI)+ReadLen)^,SizeOf(FI)-ReadLen)); if ReadLen=SizeOf(FI) then Break; end; FileName:=FI.FileName; if ReadLen=SizeOf(FI) then begin if Assigned(FOnGetFileBegin) then FOnGetFileBegin(FileName); FS:=TFileStream.Create(FileName,fmCreate); try while FS.Size<FI.FileSize do begin ReadLen:=Stream.Read(Buffer[1],4096); FS.Write(Buffer[1],ReadLen); end; finally FS.Free; end; if Assigned(FOnGetFileOver) then FOnGetFileOver; end; end; except on E:Exception do ClientSocket.Close; end; finally Stream.Free; end; end;procedure TForm1.FormCreate(Sender: TObject); begin with ServerSocket1 do begin ServerType:=stThreadBlocking; Port:=1981; Active:=True; end; with ClientSocket1 do begin ClientType:=ctBlocking; Host:='127.0.0.1'; Port:=1981; Active:=True; end; end;procedure TForm1.OnGetFile(var FileName: String); begin FileName:='c:\'+FileName; end;procedure TForm1.ServerSocket1GetThread(Sender: TObject; ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread); begin SocketThread:=TFileServerThread.Create(False,ClientSocket,OnGetFile,OnGetFileOver); end;procedure TForm1.SendFileBtnClick(Sender: TObject); var FS:TFileStream; FI:TFileInfo; begin if OpenDialog1.Execute then begin FS:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead or fmShareDenyNone); FI.FileName:=ExtractFileName(OpenDialog1.FileName); FI.FileSize:=FS.Size; ClientSocket1.Socket.SendBuf(FI,SizeOf(FI)); ClientSocket1.Socket.SendStream(FS); end; end;procedure TForm1.OnGetFileOver; begin ShowMessage('File get over!'); end;end.
http://www.99v.com.cn/Article/softtech/program/cjj/net/200506/20913.html
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;type
TFileInfo=record
FileName:String[128];
FileSize:Int64;
end;
TGetFileBeginEvent=procedure(var FileName:String) of object;
TGetFileOverEvent=procedure of object;
TFileServerThread=class(TServerClientThread)
private
FOnGetFileBegin: TGetFileBeginEvent;
FOnGetFileOver: TGetFileOverEvent;
public
constructor Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket;OnGetFileBegin: TGetFileBeginEvent;
OnGetFileOver: TGetFileOverEvent);
procedure ClientExecute;override;
end;
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
ClientSocket1: TClientSocket;
SaveDialog1: TSaveDialog;
SendFileBtn: TButton;
OpenDialog1: TOpenDialog;
procedure FormCreate(Sender: TObject);
procedure ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
procedure SendFileBtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure OnGetFile(var FileName:String);
procedure OnGetFileOver;
end;var
Form1: TForm1;implementation{$R *.dfm}{ TFileServerThread }constructor TFileServerThread.Create(CreateSuspended: Boolean;
ASocket: TServerClientWinSocket;OnGetFileBegin: TGetFileBeginEvent;
OnGetFileOver: TGetFileOverEvent);
begin
inherited Create(True,ASocket);
Self.FreeOnTerminate:=True;
FOnGetFileBegin:=OnGetFileBegin;
FOnGetFileOver:=OnGetFileOver;
if not CreateSuspended then Resume;
end;procedure TFileServerThread.ClientExecute;
var
Stream:TWinSocketStream;
FI:TFileInfo;
FS:TFileStream;
FileName:String;
ReadLen:Integer;
Buffer:String;
begin
Stream:=TWinSocketStream.Create(ClientSocket,6000);
SetLength(Buffer,4096);
try
try
while not Terminated and ClientSocket.Connected do
begin
ReadLen:=0;
while not Terminated and ClientSocket.Connected do
begin
Inc(ReadLen,Stream.Read(Pointer(Integer(@FI)+ReadLen)^,SizeOf(FI)-ReadLen));
if ReadLen=SizeOf(FI) then Break;
end;
FileName:=FI.FileName;
if ReadLen=SizeOf(FI) then
begin
if Assigned(FOnGetFileBegin) then FOnGetFileBegin(FileName);
FS:=TFileStream.Create(FileName,fmCreate);
try
while FS.Size<FI.FileSize do
begin
ReadLen:=Stream.Read(Buffer[1],4096);
FS.Write(Buffer[1],ReadLen);
end;
finally
FS.Free;
end;
if Assigned(FOnGetFileOver) then FOnGetFileOver;
end;
end;
except
on E:Exception do ClientSocket.Close;
end;
finally
Stream.Free;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
with ServerSocket1 do
begin
ServerType:=stThreadBlocking;
Port:=1981;
Active:=True;
end;
with ClientSocket1 do
begin
ClientType:=ctBlocking;
Host:='127.0.0.1';
Port:=1981;
Active:=True;
end;
end;procedure TForm1.OnGetFile(var FileName: String);
begin
FileName:='c:\'+FileName;
end;procedure TForm1.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread:=TFileServerThread.Create(False,ClientSocket,OnGetFile,OnGetFileOver);
end;procedure TForm1.SendFileBtnClick(Sender: TObject);
var
FS:TFileStream;
FI:TFileInfo;
begin
if OpenDialog1.Execute then
begin
FS:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead or fmShareDenyNone);
FI.FileName:=ExtractFileName(OpenDialog1.FileName);
FI.FileSize:=FS.Size;
ClientSocket1.Socket.SendBuf(FI,SizeOf(FI));
ClientSocket1.Socket.SendStream(FS);
end;
end;procedure TForm1.OnGetFileOver;
begin
ShowMessage('File get over!');
end;end.