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已经被基中一个请求创建, 在内存没有释放之前再接到创建的请求,这样就有冲突了。 有什么好的办法让他们可以发出请求而不会出错. 

解决方案 »

  1.   

    你应该要知道IdTCPServer1Execute函数的代码是在一个线程环境中执行的 而你的AFileStream对象是一个窗体的成员变量 在你的IdTCPServer服务线程里面根本没处理AFileStream对象同步的问题 而且这个AFileStream对象也没法在IdTCPServer服务线程里面同步 你可以将AFileStream定义为一个IdTCPServer1Execute函数的局部变量来处理
      

  2.   

    另外你要在后面加上一个while循环 因为你无法保证RecvBufferSize小于AFileStream.Size的情况下能够一次传输完毕