IdTCPServer 开发服务器端
IdTCPClient 开发客户端 S 为服务器端 Delphi(Pascal) code
private
{ Private declarations }
AFileStream: TFileStream; //传输的文件流procedure Tf_main.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
with AThread.Connection do
begin
sCommand := ReadLn();
if AnsiStartsText('down@@',sCommand) then
begin
filepath:='f:\共公盘\'+copy(sCommand,Pos('@@',sCommand)+2,length(sCommand));
AFileStream := TFileStream.Create(filepath, fmOpenRead);
end;
if sCommand = 'BEGIN' then //开始传输
begin
//告诉远程传输文件的大小和文件名
WriteLn(Format('%d|%s', [AFileStream.Size,'xxx']));
Exit;
end;
//按照指定位置传输文件
AFileStream.Seek(StrToInT(sCommand), soFromBeginning); //转到文件流传输的位置
ASize := Min(AFileStream.Size - AFileStream.Position, RecvBufferSize);
//计算需要发送的大小,Min()函数在Math单元
OpenWriteBuffer; //准备发送缓冲
WriteStream(AFileStream, false, false, ASize);
//注意这个函数的参数。
CloseWriteBuffer; //结束发送缓冲
end;
end;
当客户A和B同时向S发送请求传送文件时就会出错,应该是AFileStream已经被基中一个请求创建, 在内存没有释放之前再接到创建的请求,这样就有冲突了。 有什么好的办法让他们可以发出请求而不会出错.
IdTCPClient 开发客户端 S 为服务器端 Delphi(Pascal) code
private
{ Private declarations }
AFileStream: TFileStream; //传输的文件流procedure Tf_main.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
with AThread.Connection do
begin
sCommand := ReadLn();
if AnsiStartsText('down@@',sCommand) then
begin
filepath:='f:\共公盘\'+copy(sCommand,Pos('@@',sCommand)+2,length(sCommand));
AFileStream := TFileStream.Create(filepath, fmOpenRead);
end;
if sCommand = 'BEGIN' then //开始传输
begin
//告诉远程传输文件的大小和文件名
WriteLn(Format('%d|%s', [AFileStream.Size,'xxx']));
Exit;
end;
//按照指定位置传输文件
AFileStream.Seek(StrToInT(sCommand), soFromBeginning); //转到文件流传输的位置
ASize := Min(AFileStream.Size - AFileStream.Position, RecvBufferSize);
//计算需要发送的大小,Min()函数在Math单元
OpenWriteBuffer; //准备发送缓冲
WriteStream(AFileStream, false, false, ASize);
//注意这个函数的参数。
CloseWriteBuffer; //结束发送缓冲
end;
end;
当客户A和B同时向S发送请求传送文件时就会出错,应该是AFileStream已经被基中一个请求创建, 在内存没有释放之前再接到创建的请求,这样就有冲突了。 有什么好的办法让他们可以发出请求而不会出错.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货