张无忌兄进来讨论(50分)

  • 主题发起人 爱元元的哥哥
  • 开始时间

爱元元的哥哥

Unregistered / Unconfirmed
GUEST, unregistred user!
{ TDbServerThread }
//------------------------------------------------------------------------------
// 文件传输执行线程
procedure TDbServerThread.ClientExecute;
var
Stream: TWinSocketStream;
Buffer, strIn: string;
nRead: Integer;
nFileSize:integer;
Item:TListItem;
begin
inherited FreeOnTerminate := TRUE; // 关闭后自动释放
Stream := TWinSocketStream.Create(ClientSocket, 6000); // 6000为超时限制时间
try
while not Terminated and ClientSocket.Connected do
begin // 初始化,读取消息
Buffer := '';
strIn := '';
SetLength(Buffer, 64);
repeat
nRead := Stream.Read(Buffer[1], 64);
if nRead = 0 then
begin
ClientSocket.Close;
Break;
end;
SetLength (Buffer, nRead);
StrIn := StrIn + Buffer;
until (Pos(#10#13'.'#10#13, Buffer) > 0);

if strIn = '' then // 没有请求
Continue // 继续循环
else begin // 处理请求
StrCommand := Copy (strIn, 1, Pos (#10#13'.'#10#13, strIn) -1);

Case StrCommand[1] of
fp_FileProperty:
begin {1} // 客户要求得到文件属性
Item:=frmServer.lstView.FindCaption(1,ClientSocket.RemoteAddress,False,True,True);
if Item<>nil then begin
Item.SubItems[1]:='请求文件信息'; // 显示传输状态
end;

nFileSize:=GetFileSize(strSourceFile);

if bSendFile then
strFeedback:= fp_FileProperty + '0' + Inttostr(nFileSize) + '*' + strDestFile
else
strFeedback:= fp_FileProperty + '1' + Inttostr(nFileSize) + '*' + strDestFile;

Stream.Write(strFeedback[1], Length (strFeedback)); //应答
end;
fp_FileReady:
begin {2} // 客户准备完毕,可以发送
Item:=frmServer.lstView.FindCaption(1,ClientSocket.RemoteAddress,False,True,True);
if Item<>nil then begin
Item.SubItems[1]:='正在接收...';
end;

ClientSocket.SendStream(TFileStream.Create(strSourceFile, fmOpenRead or fmShareDenyNone));
end;
fP_FileEnd:
begin {3} // 客户接收完毕,检测完成状态
Item:=frmServer.lstView.FindCaption(1,ClientSocket.RemoteAddress,False,True,True);
if Item<>nil then begin
Item.SubItems[1]:='接受完毕...';
end;

ClientSocket.Close;
Terminate;
end;

fP_FileABORT:
begin {4} // 客户要求中断传输
Item:=frmServer.lstView.FindCaption(1,ClientSocket.RemoteAddress,False,True,True);
if Item<>nil then begin
Item.SubItems[1]:='传输因意外中断...';
end;

frmServer.Rich.Lines.Add(ClientSocket.RemoteAddress + '报告:传输因意外中断...');

ClientSocket.Close;
Terminate;
end;
end;
end;
end; // 在循环中获取消息
finally
Stream.Free;
end;
end;
 
上面是我的多线程传输代码,请指教[:)]
 
ClientSocket.SendStream(TFileStream.Create(strSourceFile, fmOpenRead or fmShareDenyNone));
着段代码要做一些修改,自己分块发送比较好
 
呵呵,本来认为系统会自动分成合适的块发送,这样效率更高。
 
其实ClientSocket.SendStream(TFileStream.Create(strSourceFile, fmOpenRead or fmShareDenyNone));
好象也是分块发的,你可以看看DELPHI的VCL代码,不过这样就不太好控制了
 
肯定是的,因为文件尺寸远远大于包的尺寸,[:)]
 
这段代码不支持断点,要修改,所以还是自己控制文件的发送。
 
OK,我修改一下
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
563
import
I
I
回复
0
查看
436
import
I
I
回复
0
查看
599
import
I
I
回复
0
查看
506
import
I
顶部