1、不是用什么技术,而是协议
2、可以使用Indy或ICS系列internet控件,均可实现FTP客户端与服务器

解决方案 »

  1.   

    SOCKET与FTP都可以
    这个不是一句话可以说完的,多看一看书吧
      

  2.   

    用socket方便一些,
    必须先执行一个socket server程序,delphi内附这个程序:Borland\Delphi5\Bin\scktsrvr.exe
      

  3.   

    FTP:delphi中的nmftp控件中Download函数只能下载一个文件,没有提供一个下载整个目录(包含子目录)的函数。
    我编写了个实现目录下载功能的方法,需要用到该功能的用户可参考一下。
    file://目录下载
    function tftp.ex_download(remote_dir,local_dir:string):boolean;
    var
        i,j,count1:integer;
        att,ss:string;
        current_dir:string;
        temp_dir:string;
    begin
        try begin
            NMFTP1.ChangeDir(remote_dir);
            current_dir:=remote_dir;
            temp_dir:=copy(current_dir,2,length(current_dir));
            if not DirectoryExists(local_dir) then CreateDir(local_dir);
            if not directoryexists(local_dir+temp_dir) then createdir(local_dir+temp_dir);
            nmftp1.ParseList:=true;
            NMftp1.list;
            count1:=nmftp1.FTPDirectoryList.name.Count;
            for i:=0 to count1-1  do begin
                file://必须
                NMFTP1.ChangeDir(current_dir);
                nmftp1.list;
                ss:=nmftp1.FTPDirectoryList.name.Strings[i];
                att:=nmftp1.FTPDirectoryList.Attribute.Strings[i];
                if (copy(pchar(att),1,1)<>'d')and(copy(pchar(att),1,1)<>'D') then begin
                    if not DirectoryExists(local_dir) then CreateDir(local_dir);
                    NMFTP1.Download(current_dir+ss,local_dir+temp_dir+ss);
                end
                else begin
                    if not directoryexists(local_dir+temp_dir+ss) then createdir(local_dir+temp_dir+ss);
                    file://递归调用
                    ex_download(remote_dir+ss+'\',local_dir);
                end;
            end;
               result:=true;
        end
        except
        On E:Exception do begin
            result:=false;
        end;
        end;
    end;
      

  4.   

    SOCKET:SOCKET传文件的例子:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ScktComp, StdCtrls;type
      TCon = record
        FileName : String;
        TotalSize : Integer;
        Status : Integer;
      end;  PCON = ^TCON;  TForm1 = class(TForm)
        SS: TServerSocket;
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure SSClientConnect(Sender: TObject; Socket: TCustomWinSocket);
        procedure SSClientRead(Sender: TObject; Socket: TCustomWinSocket);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses Unit2;{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    begin
        SS.Port := 9000;
        SS.Active := True;
    end;procedure TForm1.SSClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    var c : pcon;
    begin    c :=new(pcon);
        c.FileName := '';
        c.TotalSize :=  0 ;
        c.Status := 0;
        Socket.Data := c;
        Socket.SendText('已经连接,请输入UPLOAD FILENAME SIZE'#13#10);end;procedure TForm1.SSClientRead(Sender: TObject; Socket: TCustomWinSocket);
    var C : PCON;
        cmd:String;
        Buffer : pointer;
        nRetr : integer;
        fs : TFileStream;
    const bufferSize =  1024 ;begin
        C:= Socket.Data ;
        case c.Status of
            0 :
            begin
                   cmd := trim(Socket.ReceiveText) ;               if  Pos('UPLOAD ',uppercase(cmd)) >  0 then
                   begin
                        c.FileName := trim(Copy(cmd,Pos(' ',cmd)+1,Length(cmd)));
                        c.TotalSize := StrToInt(Copy(c.FileName,Pos(' ',c.FileName)+1,Length(c.FileName)));
                        c.FileName := trim(Copy(c.FileName,1,Pos(' ',c.FileName)));
                        c.Status := 1;
                        Socket.Data := C;
                        Socket.SendText('you can send File  !'#13#10);
                   end;
                end;
            1 : begin
                    GetMem(Buffer,BufferSize);
                    nRetr := Socket.ReceiveBuf(Buffer^,BufferSize);                if not FIleExists('c:\'+c.FileName) then
                    begin
                         fs :=TFileStream.Create('c:\'+c.FileName,fmCreate or fmShareDenyNone);
                         fs.Seek(0,soFromBeginning);
                    end
                    else
                    begin
                         fs :=TFileStream.Create('c:\'+c.FileName,fmOpenWrite or fmShareDenyNone);
                         fs.Seek(0,soFromEnd);
                    end;                fs.WriteBuffer(Buffer^,nRetr);                fs.Destroy;
                    FreeMem(Buffer);
                end;
        end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
        Form2.Show;
    end;end. 
     --------------------------------------------------------------------------------
    来自:唐晓锋 时间:99-11-30 01:17:19 ID:162654 
    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ScktComp;type
      TForm2 = class(TForm)
        CS: TClientSocket;
        OpenDialog1: TOpenDialog;
        Memo1: TMemo;
        Button1: TButton;
        Edit1: TEdit;
        Button2: TButton;
        SendCommand: TButton;
        Label1: TLabel;
        Button3: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure SendCommandClick(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure CSRead(Sender: TObject; Socket: TCustomWinSocket);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form2: TForm2;implementation{$R *.DFM}
    function GetFileSize(const FileName: string):integer;
    var f : TFileStream;
    begin
        f := TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone);
        Result :=f.Size;
        F.Free;
    end;
    procedure TForm2.Button1Click(Sender: TObject);
    begin
        with OpenDialog1 do
        begin
            Execute;
            if FileName <> '' then
            begin
                Edit1.Text := 'UPLOAD '+ ExtractFileName(FileName) +' '+Inttostr(GetFileSize(FileName));
                Label1.Caption := FileName;
                cs.Socket.SendText(edit1.Text);
            end;
        end;
    end;procedure TForm2.Button2Click(Sender: TObject);
    begin
        CS.Active := True;end;procedure TForm2.SendCommandClick(Sender: TObject);
    var fs : TFileStream;
        Buf : pointer;begin
        //CS.Socket.SendText(Edit1.Text+#13#10);
        //Memo1.Lines.Add();
        fs := TFileStream.Create(Label1.Caption ,fmOpenRead or fmShareDenyNone);    GetMem(Buf,fs.Size);
        fs.Seek(0,soFromBeginning);    fs.ReadBuffer(Buf^,fs.Size);    memo1.Lines.Add('has send : '+inttostr(Cs.Socket.SendBuf(Buf^,fs.Size)));end;procedure TForm2.Button3Click(Sender: TObject);
    begin
        cs.Close;
    end;procedure TForm2.CSRead(Sender: TObject; Socket: TCustomWinSocket);
    begin   Memo1.Lines.add(socket.receiveText);end;end.