我是一个delphi的初学者,老师布置的任务是要在局域网内实现文件传输,我真的是不太懂,希望哪个仁兄帮助一下,小弟这里万分的感谢!希望尽量详细,按扭内部的代码最要也给出,万分感谢!!!

解决方案 »

  1.   

    利用HTTP[参考RFC1867]或者FTP协议就可以传输文件.或者Socket也可以.搜一下了,很多.
      

  2.   

    //客户端
    unit client;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls, ScktComp;type
      TForm1 = class(TForm)
        ClientSocket1: TClientSocket;
        OpenDialog1: TOpenDialog;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Memo1: TMemo;
        ProgressBar2: TProgressBar;
        Edit3: TEdit;
        Edit1: TEdit;
        Edit2: TEdit;
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure ClientSocket1Connecting(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
        function  getfilename(str1:string):string;
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  type
      FileInf=Record
        name: String;         //文件名
        Size: Integer;        //文件大小
        sfile: TFileStream;   //文件
      end;
    var
      Form1: TForm1;
      mem: fileinf;
      posi, len: Integer;
    implementation{$R *.DFM}procedure TForm1.Button3Click(Sender: TObject);
    begin
      if ClientSocket1.Active then
        ClientSocket1.Active:=false;
      application.Terminate;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      if ClientSocket1.active then clientsocket1.Active:=false;
      ClientSocket1.Host:= edit1.Text;
      ClientSocket1.Port:= StrToInt(edit2.Text);
      clientsocket1.active:=true;
    //    ClientSocket1.Active:=false;
    end;
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if Opendialog1.Execute then
      begin
        edit3.Text:= Opendialog1.FileName;
        mem.name:= getfilename(Opendialog1.FileName);
      end;
    end;procedure TForm1.ClientSocket1Connecting(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
          Memo1.lines.Add('C: 正在链接...');
    end;procedure TForm1.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      p: Array[0..1023] of byte;
      RecStr: String;
    begin
      RecStr:= ClientSocket1.Socket.ReceiveText;
    //  Memo1.Lines.Add('S: '+RecStr);
      if Pos('连接成功', RecStr)> 0 then
      begin
        Memo1.Lines.Add('连接成功');
        Memo1.Lines.Add('C: 提交文件名');
        ClientSocket1.Socket.SendText('提交文件名: '+mem.name);
      end;  if Pos('成功收到文件名', RecStr)> 0 then
      begin
         posi:=0;
         len:=0;
         Try
           mem.sfile:= TFileStream.Create(mem.name, fmOpenRead);
           mem.Size:= mem.sfile.Size;
           Posi:= 0;
           Memo1.Lines.Add('C: 提交文件大小');
           ClientSocket1.Socket.SendText('提交文件大小: '+IntToStr(mem.size));
         finally
    //       mem.sfile.Free;
         end;
      end;//end if  if Pos('成功收到文件大小', RecStr)> 0 then
      begin
        Memo1.Lines.Add('C: 开始发送文件');
        ClientSocket1.Socket.SendText('开始发送文件');
      end;  if (Pos('可以发送', RecStr)> 0) or (Pos('继续发送', RecStr)> 0) then
      begin
        try
        //recfile:= TFileStream.Create(mem.name, fmOpenRead);
        if  Posi< mem.Size then
        begin
          len:= 1024;
          if mem.Size-posi< 1024 then len:= mem.Size-posi;
          mem.sfile.Position:=posi;
          mem.sfile.ReadBuffer(p,len);
    //      mem.sfile.read(p,len);
          ClientSocket1.Socket.SendBuf(p,len);
    //      memo1.lines.add('当前位置:'+inttostr(posi)+',长度:'+inttostr(len));
          if ProgressBar2.Position<>Round(posi/mem.Size*100) then
          Application.ProcessMessages;
          ProgressBar2.Position:= Round(posi/mem.Size*100);
          inc(posi, len);
        end;
        finally
        //mem.sfile.Free;
        //mem.sfile:=nil;
        end;
      end;  if Pos('文件接收失败', RecStr)> 0 then
      begin
        Memo1.Lines.Add('C: 重新提交文件名');
        ClientSocket1.Socket.SendText('提交文件名: '+mem.name);
      end;  if Pos('成功接收文件', RecStr)> 0 then
      begin
          mem.sfile.Free;
          mem.sfile:=nil;
          Memo1.Lines.Add('C: 发送文件结束');
          ClientSocket1.Socket.SendText('发送文件结束');
      end;
    end;function  TForm1.getfilename(str1:string):string;
    var
      myi:integer;
      str2:string;
    begin
      str2:='';
      if length(str1)=0 then result:=''
      else
      begin
        if pos('\',str1)<1 then result:=str1
        else
        begin
          for myi:=length(str1) downto 1 do
          begin
            if str1[myi]='\' then  Break;
            str2:=str1[myi]+str2;
          end;
          result:=str2;
        end;
      end;
    end;
    end.
      

  4.   

    //服务器unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ComCtrls, StdCtrls, ScktComp;type
      TForm1 = class(TForm)
        Button2: TButton;
        Memo1: TMemo;
        ProgressBar1: TProgressBar;
        ServerSocket1: TServerSocket;
        procedure Button2Click(Sender: TObject);
         procedure ServerSocket1ClientConnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ServerSocket1ClientRead(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ServerSocket1ClientDisconnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ServerSocket1ClientError(Sender: TObject;
          Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
          var ErrorCode: Integer);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      Sendf: boolean;
      filename:String;
      filesize:integer;
      recfile: TFileStream;
      ReadCount : integer;
    implementation{$R *.DFM}
    procedure TForm1.Button2Click(Sender: TObject);
    begin  if ServerSocket1.Active then
        ServerSocket1.Active:= False;
      application.Terminate;  
    end;procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
     socket.SendText('连接成功...');end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      recStr: String;
      Buffer : pointer;
      nRetr : integer;
    const
      bufferSize = 1024 ;begin
      if not sendf then
      begin
      RecStr:= socket.ReceiveText;
      memo1.Lines.add(recstr);
      end;
      if Pos('提交文件名', RecStr)>0 then
      begin
        delete(RecStr, 1, length('提交文件名: '));
        filename:='c:\'+RecStr;
        socket.SendText('成功收到文件名');
      end;  if Pos('提交文件大小', RecStr)>0 then
      begin
        delete(RecStr, 1, length('提交文件大小: '));
        fileSize:=StrToIntDef(RecStr,0);
        if FileExists(Filename) then Deletefile(filename);
        recfile :=TFileStream.Create(filename,fmCreate or fmShareDenyNone);
        if recfile<>nil then
        begin
          recfile.Free;
          recfile:= nil;
        end;
        socket.SendText('成功收到文件大小');
      end;
      

  5.   


      if sendf then
      begin
        GetMem(Buffer,BufferSize);
        nRetr := Socket.ReceiveBuf(Buffer^,BufferSize);
        inc(readcount, nretr);
        ProgressBar1.Position:= Round(readcount/filesize*100);
        Application.ProcessMessages;    if FIleExists(filename) then
        begin
          recfile :=TFileStream.Create(filename,fmOpenWrite or fmShareDenyNone);
          recfile.Seek(0,soFromEnd);
        end;
        recfile.write(Buffer^,nRetr);
        FreeMem(Buffer);
        recfile.Free;
        recfile:= nil;    if readcount=filesize then
        begin
         memo1.Lines.add('成功接收文件');
         socket.SendText('成功接收文件');
         recfile.Free;
         recfile:=nil;
         sendf:=false;
        end
        else socket.SendText('继续发送');
      end;  if Pos('开始发送文件', RecStr)>0 then
      begin
         socket.SendText('可以发送');
         ReadCount:=0;
         sendf:=true;
      end; 
    end;procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
     showmessage('客户已停止链接');
    end;procedure TForm1.ServerSocket1ClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
     showmessage('客户已出错');
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
       serversocket1.Close;
    end;end.