这两天编写文件传输的程序碰到些问题还请大家帮帮忙。使用INDY 9.0的IDTcpClient和IDTcpServer控件,Ddelphi 7。客户端向服务器端发文件:  问题1:客户端可以发文件,但服务器端接收不到?
  问题2:怎样实现多文件传输?
  问题3:发文件怎样实现断点续传?
只要问题解决,分不够可令开帖加。
源代码:
======================================
客户端:unit Client;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Gauges, StdCtrls, ExtCtrls, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient;type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    Panel2: TPanel;
    Edit3: TEdit;
    Button1: TButton;
    Gauge1: TGauge;
    Panel3: TPanel;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    OpenDialog1: TOpenDialog;
    IdTCPClient1: TIdTCPClient;
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;type
  FileInf=Record
    name: String;         //文件名
    Size: Integer;        //文件大小
    sfile: TFileStream;   //文件
  end;var
  Form1: TForm1;implementation{$R *.dfm}
var
  mem: fileinf;procedure TForm1.Button3Click(Sender: TObject);
begin
  if idtcpclient1.Connected then
    idtcpclient1.Disconnect;
  application.Terminate;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  if Opendialog1.Execute then
  begin
    edit3.Text:= Opendialog1.FileName;
    mem.name:= Opendialog1.FileName;
  end;  
end;procedure TForm1.Button2Click(Sender: TObject);
var
  p: Array[0..1023] of byte;
  posi, len: Integer;
  RecStr: String;
begin
  with IdTcpClient1 do
  begin
    Host:= edit1.Text;
    Port:= StrToInt(edit2.Text);
    Connect(5);
  end;  if idtcpclient1.Connected then
  begin
    RecStr:= IdTcpClient1.ReadLn;
    Memo1.Lines.Add('S: '+RecStr);    Memo1.Lines.Add('C: 提交文件名');
    idTcpClient1.WriteLn('提交文件名: '+mem.name);
    RecStr:= IdTcpClient1.Readln;
    Memo1.Lines.Add('S: '+ RecStr);
    if Pos('成功收到文件名', RecStr)> 0 then
    begin
      mem.sfile:= TFileStream.Create(mem.name, fmOpenRead);
      Try
        mem.Size:= mem.sfile.Size;
        Posi:= 0;
        Memo1.Lines.Add('C: 提交文件大小');
        idTcpClient1.WriteLn('提交文件大小: '+IntToStr(mem.size));
        RecStr:= idTcpClient1.Readln;
        Memo1.Lines.Add('S: '+ RecStr);
        if Pos('成功收到文件大小', RecStr)> 0 then
        begin
          Memo1.Lines.Add('C: 开始发送文件');
          idtcpclient1.WriteLn('开始发送文件');          While Posi< mem.Size do
          begin
            len:= 1024;
            if mem.Size-posi< 1024 then len:= mem.Size-posi;
            mem.sfile.Read(p, len);
            idTcpClient1.WriteBuffer(p, len);
            inc(posi, len);
            Gauge1.Progress:= Round(posi/mem.Size*100);
            Application.ProcessMessages;
          end;          Memo1.Lines.Add('C: 发送文件结束');
          idtcpclient1.WriteLn('发送文件结束');
          RecStr:= idTcpClient1.ReadLn;
          Memo1.lines.Add('S: '+ RecStr);
        end;
      finally
        mem.sfile.Free;
      end;
    end; 
  end;  IdTcpClient1.Disconnect;
end;end.======================================
服务器端:unit Server;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Gauges, IdBaseComponent, IdComponent,
  IdTCPServer;type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Panel2: TPanel;
    Edit2: TEdit;
    Gauge1: TGauge;
    Label2: TLabel;
    SaveDialog1: TSaveDialog;
    IdTCPServer1: TIdTCPServer;
    Panel3: TPanel;
    Memo1: TMemo;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure IdTCPServer1Connect(AThread: TIdPeerThread);
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
  if Button1.Caption = 'Active' then
  begin
    Button1.Caption := 'Stop';
    idTcpServer1.DefaultPort:= StrToInt(edit1.Text);
    idtcpserver1.Active := true;
  end
  else begin
    Button1.Caption := 'Active';
    idtcpserver1.Active := false;
  end;
end;procedure TForm1.Button3Click(Sender: TObject);
begin
  if idtcpServer1.Active then
    idtcpServer1.Active:= False;
  application.Terminate;  
end;procedure TForm1.FormCreate(Sender: TObject);
begin
  button1Click(self);
end;procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
  AThread.Connection.Writeln('连接成功...');
end;procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  recStr: String;
  filename:String;
  filesize:integer;
  recfile: TFileStream;
begin
  filesize:= 0;
  recfile:= nil;
  RecStr:= AThread.Connection.ReadLn;
  if Pos('提交文件名', RecStr)>0 then
  begin
    delete(RecStr, 1, length('提交文件名: '));
    filename:=RecStr;
    AThread.Connection.WriteLn('成功收到文件名');
  end
  else if Pos('提交文件大小', RecStr)>0 then
  begin
    delete(RecStr, 1, length('提交文件大小: '));
    fileSize:=StrToIntDef(RecStr,0);    savedialog1.FileName:= fileName;
    if SaveDialog1.Execute then
    begin
      filename:= SaveDialog1.FileName;
      if FileExists(Filename) then Deletefile(filename);
      if recfile<>nil then
      begin
        recfile.Free;
        recfile:= nil;
      end;
      if not fileExists(filename) then
        recfile:= TFileStream.Create(filename, fmOpenReadWrite or fmCreate)
      else
        recfile:= TFileStream.Create(filename, fmOpenReadWrite);
    end;    AThread.Connection.WriteLn('成功收到文件大小');
  end
  //else if Pos('开始发送文件', RecStr)>0 then
  //begin
  //
  //end
  else if Pos('发送文件结束', RecStr)>0 then
  begin
    if recfile<>nil then
    begin
      recfile.Free;
      recfile:= nil;
      AThread.Connection.WriteLn('文件接收成功');
    end;
    filename:= '';
    filesize:= 0;
  end
  else
  begin
    if recfile<>nil then
    begin
      recfile.Seek(0,2);
      AThread.Connection.OpenWriteBuffer;
      AThread.Connection.WriteStream(recfile);
      AThread.Connection.CloseWriteBuffer;
      Gauge1.Progress:= Round(recfile.size/filesize*100);
      Application.ProcessMessages;
    end;
  end;
end;end.

解决方案 »

  1.   

    老大有没有注意到那个tcpclient里面好像有个sendfile(transmitfile)这样的方法?
      

  2.   

    例子:
    http://218.56.11.178:8020/web/index.aspx-》下载基地-》例程-网络技术-》演示TCP通讯服务/客户的连接参考一下吧
      

  3.   

    在tcpclient端,直接使用以下流程即可
                    OpenWriteBuffer;
                    clearwritebuffer;
                    WriteStream(TStream);
                    CloseWriteBuffer;
    在服务器端Tcpserver.onexecute事件里使用readstream接收。
      

  4.   

    我试了 haosir(大好) 的方法可以传,但文件大了好像跟死机一样,怎么解决
      

  5.   

    starcbh(心有灵犀一点通):你的信我收到了,但里边没有附件(Demo)
    麻烦你再从发一下吧。