功能:客户端用idtcpclient发送多个文件,服务器用idtcpserver一一接收,接收后保存在已建好的文件夹中,文件名和
      发送的文件名相同。(变量fileSTR中保存要 发送的多个文件信息。如fileSTR[I]:='ja\d:\kk\d.doc',其中ja为
      服务端保存文件的文件夹,d.doc为保存在该项文件夹下的文件名。即服务器收到该文件后要保有存在:
      'ja\d.doc'。 下面代码中的注释部分以之为例)问题:服务端只收到第一个文件,后面发的文件收不到。请高手帮忙!谢谢!客户端发送代码:Type
  TFilenameSTR=record
  Filename:string[255];
  End;
Var
  FilenameSTR: TFilenameSTR;
  FileSTR:Tstringlist;//  比如  fileSTR[I]:=’ja\d:\kk\d.doc’;
begin
  try
    FileSTR:=Tstringlist.create;
    tempstream:=TMemoryStream.Create;
    with IdTCPClient1 do
    try
      if Connected then Disconnect;
     //不想每发一个文件连接服务器一次,
     //故将 Connect()置于循环体:
     //for i:=0 to fileSTR.Count-1 do之外
      Connect();
      for i:=0 to fileSTR.Count-1 do //遍历文件遂个发送。
      begin
        s1:=trim(Copy(fileSTR[i],1,Pos('\',fileSTR[i])));          //比如S1:=ja\
        s2:=copy(fileSTR[i],Pos('\',fileSTR[i])+1,Length(fileSTR[i]));//比如s2:=d:\kk\d.doc
        filenameSTR.filename:=s1+ExtractFileName(s2);//待发送字符串(文件头信息) ja\d.doc
        tempstream.LoadFromFile(s2); //待发送的文件流
        WriteBuffer(filenameSTR,SizeOf(filenameSTR)); //发送文件头信息 :  ja\d.doc
        WriteStream(tempstream);//发送文件流
        tempstream.Clear; //清除流并使流位置=0,为下一次发文件流作准备
      end;
    except
      ShowMessage('发送失败!');
    end;
  finally
    fileSTR.Free;
    tempstream.Free;
    //断开连接
    if IdTCPClient1.Connected then IdTCPClient1.Disconnect;  end;
end;服务器端代码:
procedure Tjtjs_Form.FormCreate(Sender: TObject);  //开始监听
begin
  IdTCPServer1.TerminateWaitTime:=30000;
  IdTCPServer1.DefaultPort:=2000;
  IdTCPServer1.ListenQueue:=200;
  IdTCPServer1.Active:=True; 
end;procedure Tjtjs_Form.IdTCPServer1Execute(AThread: TIdPeerThread);//接收文件(问题就出在这,只能接到一个文件)
type
  TfilenameSTR=record   //接收到的文件名
  filename:string[255];
  end;
var
  filenameSTR:TfilenameSTR;
  tempstream:TMemoryStream;
  savefilename:string;   //保存的文件名
begin
  if (AThread.Terminated=False) and (AThread.Connection.Con_nected=true) then
  begin
    AThread.Connection.ReadBuffer(filenameSTR,SizeOf(filenameSTR));
    tempstream:=TMemoryStream.Create;
    AThread.Connection.ReadStream(tempstream,-1,True);
    tempstream.Position:=0;
    savefilename:=ExtractFilePath(ParamStr(0))+filenamestr.filename;  
    tempstream.SaveToFile(savefilename);
    ComboBox1.Items.Add(savefilename);
  end;
end;procedure Tjtjs_Form.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
  AThread.Data:=TObject(AThread.Connection.LOCALNAME);
  ComboBox1.Items.Add(AThread.Connection.LocalName);
  
end;procedure Tjtjs_Form.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
  AThread.Data:=TObject(AThread.Connection.LOCALNAME);
  AThread.Connection.Disconnect;
  AThread.Terminate;
  AThread.Data:=nil;
end;procedure Tjtjs_Form.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  IdTCPServer1.Threads.Clear;
  //IdTCPServer1.Threads.Free;
end;

解决方案 »

  1.   

    TO: hongqi162我的循环体内不就是先发文件头信息 WriteBuffer(filenameSTR,SizeOf(filenameSTR)); //发送文件头信息 : ja\d.doc 再: WriteStream(tempstream);//发送文件流
    for i:=0 to fileSTR.Count-1 do //遍历文件遂个发送。
      begin
      s1:=trim(Copy(fileSTR[i],1,Pos('\',fileSTR[i]))); //比如S1:=ja\
      s2:=copy(fileSTR[i],Pos('\',fileSTR[i])+1,Length(fileSTR[i]));//比如s2:=d:\kk\d.doc
      filenameSTR.filename:=s1+ExtractFileName(s2);//待发送字符串(文件头信息) ja\d.doc
      tempstream.LoadFromFile(s2); //待发送的文件流
      WriteBuffer(filenameSTR,SizeOf(filenameSTR)); //发送文件头信息 : ja\d.doc
      WriteStream(tempstream);//发送文件流
      tempstream.Clear; //清除流并使流位置=0,为下一次发文件流作准备