要传送多个文件memo1中的,怎么才能控制传完一个接着传令一个,我在发送端无法用循环将文件读成流,怎么办?是不是传输完一个文件就结束一个AThread?
服务器:procedure Tfrm_Server.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  cmd: string; //接收到客户端的字符串信息
  ASize: Integer; //需要传输的流大小
begin
  with AThread.Connection do //已经连街上的一个进程
  begin
   cmd := UpperCase(ReadLn); //客户端发送的命令字符串
    if cmd = 'BEGIN' then //开始传输
    begin
      //告诉远程传输文件的大小和文件名
      WriteLn(Format('%d|%s', [AFileStream.Size, ExtractFileName(Memo1.Lines[FileNum])]));
      StatusBar1.SimpleText := '准备传输...';
      Exit;
    end;
    if cmd = 'END' then
    begin //传输完成
             AFileStream.Free; //释放文件流
      FileNum := FileNum-1;
      WriteLn(inttostr(FileNum));
      StatusBar1.SimpleText := '传输完成...';
      Exit;
    end;    if cmd = 'CANCEL' then
    begin //传输取消
      StatusBar1.SimpleText := '传输取消...';
      //保持传输状态
      Exit;
    end;
    
    //按照指定位置传输文件
    AFileStream.Seek(StrToInT(cmd), soFromBeginning); //转到文件流传输的位置
    ASize := Min(AFileStream.Size - AFileStream.Position, RecvBufferSize);
    //计算需要发送的大小,Min()函数在Math单元
    OpenWriteBuffer; //准备发送缓冲
    WriteStream(AFileStream,True,false);//1-3
    //注意这个函数的参数。
    CloseWriteBuffer; //结束发送缓冲
    StatusBar1.SimpleText := Format('当前传输位置%s/大小%d', [cmd, AFileStream.Size]);
    ProgressBar1.Position := ProgressBar1.Position + ASize;
   until (FileNum =0);
  end;end;
procedure Tfrm_Server.FormShow(Sender: TObject);
begin
 //建立文件流
  AFileStream := TFileStream.Create(Memo1.Lines[FileNum], fmOpenRead);
  //服务器准备好连接
  IdTCPServer1.DefaultPort := StrToIntDef(Edit2.Text, 9925);
  if not IdTCPServer1.Active then IdTCPServer1.Active := True;
end;end.

解决方案 »

  1.   

    indytcp是用单独的线程接收数据的,一次只能读一个文件吧。如果要接收多个文件,你要判断接受的线程是那个,然后分别读到缓冲里面。你这样直接发送文件不能实现多文件传输的,用块发送,块里面包含文件流等信息。这样的语句WriteLn(Format('%d|%s', [AFileStream.Size, ExtractFileName(Memo1.Lines[FileNum])]));注定不能接收多个文件的。
      

  2.   

    我这里有用Indy10做的一个程序DEMO,如果你是用Indy10,可以给偶发信息并留个电邮