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.
上一篇:AtcoderABC-142E-GetEverything


下一篇:P1896 [SCOI2005]互不侵犯