• idtcp实现文件下载和上传


    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
      StdCtrls;
    
    type
      TForm1 = class(TForm)
        btnReceive: TButton;
        IdTCPClient1: TIdTCPClient;
        btnSend: TButton;
        procedure btnReceiveClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure btnSendClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.btnReceiveClick(Sender: TObject);
    var
        rbyte:array[0..4096] of byte;
        sFile:TFileStream;
        iFileSize:integer;
    begin
      iFileSize:=IdTCPClient1.ReadInteger;
    
      sFile:=TFileStream.Create('xx.pdf',fmCreate);
      While iFileSize>4096 do
      begin
          IdTCPClient1.ReadBuffer(rbyte,4096);// .ReadBuffer(rbyte,iLen);
          sFile.Write(rByte,4096);
          inc(iFileSize,-4096);
      end;
      IdTCPClient1.ReadBuffer(rbyte,iFileSize);// .ReadBuffer(rbyte,iLen);
      sFile.Write(rByte,iFileSize);
      sFile.Free;
      ShowMessage('file get ok!');
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    //  IdTCPClient1.BoundIP:= '127.0.0.1';
    //  IdTCPClient1.BoundPort:= 90011;
    
      IdTCPClient1.Host:= '127.0.0.1';
      IdTCPClient1.Port:= 9000;
    
    
      IdTcpClient1.Connect(5000);
      self.Caption:= '启动';
    end;
    
    procedure TForm1.btnSendClick(Sender: TObject);
    var
        iFileHandle:integer;
        iFileLen,cnt:integer;
        buf:array[0..4096] of byte;
    
    begin
    //  IdTCPClient1.Host:='127.0.0.1';
    //  IdTCPClient1.Port:=9000;
    
    
        //IdTCPClient1.Connect(5000);
    
    
      if IdTCPClient1.Connected then
      begin
        iFileHandle:=FileOpen('xx.pdf',fmOpenRead);
        iFileLen:=FileSeek(iFileHandle,0,2); //2 :soFromBeginning : from the end of the file
        FileSeek(iFileHandle,0,0);
    //    ProgressBar1.Max:=iFileLen;
    //    ProgressBar1.Position := 0;
        IdTCPClient1.WriteLn('xx.pdf'+'|'+IntToStr(iFileLen));
        while true do
        begin
          Application.ProcessMessages;
          cnt:=FileRead(iFileHandle,buf,4096);
          IdTCPClient1.WriteBuffer(buf,cnt);
         // IdTCPClient1.WriteInteger(cnt);
         
    //      ProgressBar1.Position:=ProgressBar1.Position + cnt;
    //      StatusBar1.Panels[0].Text:='正在传送文件...';
          if cnt<4096 then
              break;
        end;
    
        FileClose(iFileHandle);
    //    Label2.Caption:='文件传送完成!';
    //    StatusBar1.Panels[0].Text:='文件传送完成!';
       end;
    end;
    
    end.
    
    
    
    
    
    
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPServer;
    
    type
      TForm1 = class(TForm)
        IdTCPServer1: TIdTCPServer;
        procedure IdTCPServer1Execute(AThread: TIdPeerThread);
        procedure FormCreate(Sender: TObject);
        procedure IdTCPServer1Connect(AThread: TIdPeerThread);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    uses IdSocketHandle;
    
    
    //server 接收
    procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
    var
      rbyte:array[0..4096] of byte;
      sFile:TFileStream;
      cnt,cmd,FileSize:integer;
      str,FileName:string;
    begin
        str:=AThread.Connection.ReadLn;   //接收文件大小及文件名
    
        cmd:=pos('|',str); //查找分隔符
        FileName:=copy(str,1,cmd-1); //提取文件名
        //IdTCPClient1.WriteLn(ExtractFileName(edtFileName.Text)+'|'+IntToStr(iFileLen));
        FileSize:=StrToInt(copy(str,cmd+1,Length(str)-cmd+1)); //提取文件大小
        if MessageBox(0,Pchar('用户 '+AThread.Connection.Socket.Binding.PeerIP+'要给您传送文件 "'+FileName+'" 您是接受还是拒绝?'),'文件接受',MB_YesNo or MB_ICONQUESTION)=ID_Yes then //询问是否接收
        begin
    //      ProgressBar1.Max:=FileSize;   //初始化进度条
    //      ProgressBar1.Position:=0;
    //      SaveDialog1.FileName:=FileName; //指定保存的默认文件名,一定要在 SaveDialog1.Execute;之前,不然文件名为空
    //      SaveDialog1.Execute;
    
          //sFile:=TFileStream.Create(SaveDialog1.FileName,fmCreate); //创建待写入的文件流
          sFile:=TFileStream.Create(FileName,fmCreate); //创建待写入的文件流
          While FileSize>4096 do
          begin
            AThread.Connection.ReadBuffer(rbyte,4096);// 读取文件流
            sFile.Write(rByte,4096);      //写入文件流
          //  cnt:=AThread.Connection.ReadInteger; //从发送端接收最新的进度位置信息
    //        ProgressBar1.Position:=ProgressBar1.Position+cnt; //更新显示进度
    //        Label1.Caption:='当前接收进度..';
    //        StatusBar1.Panels[0].Text:='正在接收文件中...';
            inc(FileSize,-4096);
         end;
          AThread.Connection.ReadBuffer(rbyte,FileSize);// .ReadBuffer(rbyte,iLen);
          sFile.Write(rByte,FileSize);
          sFile.Free;
    //    StatusBar1.Panels[0].Text:='文件接收完成!';
    //    Label1.Caption:='文件接收完成!';
        end;
       END;
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      h:TIdSocketHandle;
    begin
      begin
       IdTCPServer1.DefaultPort:=9000;
    //   h:= IdTCPServer1.Bindings.Add;
    //   h.IP:= '127.0.0.1';
    //   h.Port:=90011;
       IdTCPServer1.Active:=True;
       Self.Caption:= '启动';
      end;
    end;
    
    //服务端 发送文件
    procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
    var
      iFileHandle:integer;
      iFileLen,cnt:integer;
      buf:array[0..4096] of byte;
    begin
        iFileHandle:=FileOpen('xx.pdf',fmOpenRead);
        iFileLen:=FileSeek(iFileHandle,0,2);
        FileSeek(iFileHandle,0,0);
        AThread.Connection.WriteInteger(iFileLen);
        while true do
        begin
            cnt:=FileRead(iFileHandle,buf,4096);
            AThread.Connection.WriteBuffer(buf,cnt);
            if cnt<4096 then
                break;
        end;
        FileClose(iFileHandle);
    end;
    
    end.
    书搞进脑袋 创新 创造; 积极
  • 相关阅读:
    slf4j的使用
    hashMap
    HBase
    HBase应用快速开发
    初学MongoDB 遇到提示由于目标计算机积极拒绝,无法连接
    Flask学习中运行“helloworld”出现UnicodeDecodeError: 'utf-8' codec can't decode问题
    doGet或doPost方法没有调用的一个原因
    markdown测试
    tomcat集成到IDEA与部署项目
    tomcat部署项目的方式
  • 原文地址:https://www.cnblogs.com/tobetterlife/p/12169515.html
Copyright © 2020-2023  润新知