就是还是用下面那种方法,怎么实现多个文件传输,请大家帮帮忙~!我急着用
unit U_Server;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent, IdTCPServer, Math;type
  Tfrm_Server = class(TForm)
    IdTCPServer1: TIdTCPServer;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ProgressBar1: TProgressBar;
    StatusBar1: TStatusBar;
    Edit1: TEdit;
    Button4: TButton;
    OpenDialog1: TOpenDialog;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    AFileStream: TFileStream; //传输的文件流
    procedure ButtonBegin;
    procedure ButtonEnd;
    { Private declarations }
  public
    { Public declarations }
  end;var
  frm_Server: Tfrm_Server;implementation{$R *.dfm}procedure Tfrm_Server.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    Edit1.Text := OpenDialog1.FileName;
end;procedure Tfrm_Server.Button4Click(Sender: TObject);
begin
  Close;
end;procedure Tfrm_Server.Button2Click(Sender: TObject);
begin
  if not FileExists(Edit1.Text) then //检测文件是否存在
  begin
    Showmessage('文件不存在,请选择文件!');
    exit;
  end;
  //建立文件流
  AFileStream := TFileStream.Create(Edit1.Text, fmOpenRead);
  ProgressBar1.Max := AFileStream.Size;
  ProgressBar1.Position := 0;
  ButtonBegin; //VCL开始状态设置
  //服务器准备好连接
  IdTCPServer1.DefaultPort := StrToIntDef(Edit2.Text, 9925);
  if not IdTCPServer1.Active then IdTCPServer1.Active := True;
end;procedure Tfrm_Server.ButtonBegin;
begin //VCL开始状态设置
  Button1.Enabled := False;
  Button2.Enabled := False;
  Button3.Enabled := True;
  Button4.Enabled := False;
end;procedure Tfrm_Server.ButtonEnd;
begin //VCL结束状态设置
  Button1.Enabled := True;
  Button2.Enabled := True;
  Button3.Enabled := False;
  Button4.Enabled := True;
end;procedure Tfrm_Server.Button3Click(Sender: TObject);
begin
  StatusBar1.SimpleText := '传输取消...';
  AFileStream.Free; //释放文件流
  ButtonEnd; //VCL结束状态设置
end;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(Edit1.Text)]));
      StatusBar1.SimpleText := '准备传输...';
      Exit;
    end;
    if cmd = 'END' then
    begin //传输完成
      Button3.Click;
      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, false, false, ASize);
    //注意这个函数的参数。
    CloseWriteBuffer; //结束发送缓冲
    StatusBar1.SimpleText := Format('当前传输位置%s/大小%d', [cmd, AFileStream.Size]);
    ProgressBar1.Position := ProgressBar1.Position + ASize;
  end;
end;procedure Tfrm_Server.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  IdTCPServer1.Active := False;
end;end.
======================================================================================
这是客户端的代码
unit U_Client;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, Math,
  StdCtrls, ComCtrls;type
  Tfrm_Client = class(TForm)
    SaveDialog1: TSaveDialog;
    IdTCPClient1: TIdTCPClient;
    Button1: TButton;
    StatusBar1: TStatusBar;
    Edit1: TEdit;
    Label1: TLabel;
    Edit2: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Edit3: TEdit;
    Label4: TLabel;
    Edit4: TEdit;
    Label5: TLabel;
    Edit5: TEdit;
    Label6: TLabel;
    Edit6: TEdit;
    Label7: TLabel;
    Edit7: TEdit;
    Label8: TLabel;
    Edit8: TEdit;
    Label9: TLabel;
    Edit9: TEdit;
    Label10: TLabel;
    Edit10: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  frm_Client: Tfrm_Client;implementation{$R *.dfm}procedure Tfrm_Client.Button1Click(Sender: TObject);
var
  cmd: string;
  ASize, TotalSize: Int64;
  AFileStream: TFileStream;
begin
  IdTCPClient1.Host := Edit1.Text; //连接主机
  IdTCPClient1.Port := StrToIntDef(Edit2.Text, 9925); //端口
  IdTCPClient1.Connect; //连接
  try
    IdTCPClient1.WriteLn('BEGIN'); //提示服务器开始接收
    cmd := IdTCPClient1.ReadLn;
    //以“|”符号分离文件名
    SaveDialog1.FileName := Copy(cmd, Pos('|', cmd) + 1, Length(cmd));
    if not SaveDialog1.Execute then
    begin
      IdTCPClient1.WriteLn('CANCEL'); //告诉服务器取消
      IdTCPClient1.Disconnect; //断开连接
      exit;
    end;
    TotalSize := StrToInt(Copy(cmd, 0, Pos('|', cmd) - 1));
    //建立文件流准备接收
    AFileStream := TFileStream.Create(SaveDialog1.FileName, fmCreate);
    try //循环开始接受
      repeat
        IdTCPClient1.WriteLn(IntToStr(AFileStream.Size));//发送当前传输的位置
        ASize := Min(TotalSize - AFileStream.Size, IdTCPClient1.RecvBufferSize);
        showmessage('IdTcpClient1.RecvBuffersize='+inttostr(IdTcpClient1.RecvBufferSize));
        edit6.Text:=inttostr(IdTcpClient1.RecvBufferSize);
        showmessage('TotalSize='+inttostr(TotalSize));
        edit7.Text:=inttostr(TotalSize);
        showmessage('AFileStream.Size='+inttostr(AFileStream.Size));
        edit8.Text:=inttostr(AFileStream.Size);
        showmessage('Asize='+inttostr(ASize));
        edit9.Text:=inttostr(ASize);
        //选择剩余大小和缓冲区大小小的一个作为传输的大小
        IdTCPClient1.ReadStream(AFileStream, ASize); //接收流
        showmessage('AFileStream.size'+inttostr(AFileStream.size));
        edit10.Text:=inttostr(AFileStream.size);
        showmessage('Asize='+inttostr(ASize));
        StatusBar1.SimpleText := Format('当前传输位置%d/大小%d', [AFileStream.Size, TotalSize]);
        Application.ProcessMessages;
      until AFileStream.Size = TotalSize; //大小一致了表示结束
    finally
      AFileStream.Free; //释放文件流
    end;
    IdTCPClient1.WriteLn('END'); //提示服务器传输完成
    StatusBar1.SimpleText := '传输完成...';
  except
    StatusBar1.SimpleText := '连接服务器失败或者对方已经中断传输!';
  end;
  IdTCPClient1.Disconnect;
end;end.这是在网上找到的,我拿出来给大家分享,希望各位能帮我解决这个问题,谢谢各位了!

解决方案 »

  1.   

    我是这样想的,可不可用filelistbox,选择多个文件,然后存入Tstringlist,然后做个循环来发送,不知道这个方法可不可以
      

  2.   

    TO:reborter (持之以恒) 你的代码我怎么传不了文件啊
      

  3.   

    你那方法应该可以呀,或者用个STRING数组来存。
      

  4.   

    To:ttily77(思考中................................) 
    下午不在,我这个从网上下的,能用,如果要的话,我发给你
      

  5.   

    TO:snowtinge(光脚丫) 
    不是我想这样,那家公司要求就是要同时传送多个文件,
      

  6.   

    TO:reborter(持之以恒)你能发给我看看吗,
    [email protected]
    谢谢了
      

  7.   

    TO:reborter(持之以恒)你能也发给我一份吗,谢谢
    [email protected]
      

  8.   

    为什么我在线程里创建文件流不行啊?
    即:把AFileStream := TFileStream.Create(Edit1.Text, fmOpenRead);这一句放到
    procedure Tfrm_Server.IdTCPServer1Execute(AThread: TIdPeerThread);里,他只传了一部分,即32KB
      

  9.   

    IdTCPServer是多线程的,你只需要在客户端传几个,开几个线程连接上,传文件就可以了
      

  10.   

    我看了一写资料,好象tidtcpserver里面有个这样属性,