A
aKnightChen
Unregistered / Unconfirmed
GUEST, unregistred user!
我做个文件系统,多人同时传。
以前我用TCPServer,用法与TIdTCPServer差别很大。
服务端代码如下:(删除了一些无关的内容)
procedure TfrmMain.tcpSvrExecute(AThread: TIdPeerThread);
var
....
begin
with AThread.Connection do
begin
if ReadLN=TELL_YOU_MY_FILE_NAME_AND_SIZE/*这是个常量*/ then
begin
aFileStream:=TFileStream.Create('c:/xxxx.rar',fmCreate);
//开始向客户端索取文件....
//这种模式不太好,是服务器不管别人反映,盲目发收文件,可能会造成服务器很重的负担...
try //循环开始接受
repeat
WriteLn(IntToStr(aFileStream.Size));//发送当前传输的位置
//选择剩余大小和缓冲区大小小的一个作为传输的大小
ReadStream(aFileStream, Min(aFileSize-aFileStream.Size,RecvBufferSize) ); //接收流
aNowFilePosition:=AFileStream.Size;
Application.ProcessMessages;
until aFileStream.Size=aFileSize; //大小一致了表示结束
finally
FreeAndNil(aFileStream); //释放文件流
end;
end;
end;
end;
************************************************************************
即:我是在tcpSvrExecute中,收到开始接收文件命令,就直接一次性(一口气)循环收文件
以前的TCPServer是多次进入Execute中,多次接收文件,
我的这种方法也成功,也支持多人同时上传(已实测过)
但我不知哪种占用资源最小?
************************************************************************
以前我用TCPServer,用法与TIdTCPServer差别很大。
服务端代码如下:(删除了一些无关的内容)
procedure TfrmMain.tcpSvrExecute(AThread: TIdPeerThread);
var
....
begin
with AThread.Connection do
begin
if ReadLN=TELL_YOU_MY_FILE_NAME_AND_SIZE/*这是个常量*/ then
begin
aFileStream:=TFileStream.Create('c:/xxxx.rar',fmCreate);
//开始向客户端索取文件....
//这种模式不太好,是服务器不管别人反映,盲目发收文件,可能会造成服务器很重的负担...
try //循环开始接受
repeat
WriteLn(IntToStr(aFileStream.Size));//发送当前传输的位置
//选择剩余大小和缓冲区大小小的一个作为传输的大小
ReadStream(aFileStream, Min(aFileSize-aFileStream.Size,RecvBufferSize) ); //接收流
aNowFilePosition:=AFileStream.Size;
Application.ProcessMessages;
until aFileStream.Size=aFileSize; //大小一致了表示结束
finally
FreeAndNil(aFileStream); //释放文件流
end;
end;
end;
end;
************************************************************************
即:我是在tcpSvrExecute中,收到开始接收文件命令,就直接一次性(一口气)循环收文件
以前的TCPServer是多次进入Execute中,多次接收文件,
我的这种方法也成功,也支持多人同时上传(已实测过)
但我不知哪种占用资源最小?
************************************************************************