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;