U_Client.pas
上传用户:lzzxgs
上传日期:2013-03-15
资源大小:474k
文件大小:2k
源码类别:

P2P编程

开发平台:

Delphi

  1. unit U_Client;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, Math,
  6.   StdCtrls, ComCtrls;
  7. type
  8.   Tfrm_Client = class(TForm)
  9.     SaveDialog1: TSaveDialog;
  10.     IdTCPClient1: TIdTCPClient;
  11.     Button1: TButton;
  12.     StatusBar1: TStatusBar;
  13.     Edit1: TEdit;
  14.     Label1: TLabel;
  15.     Edit2: TEdit;
  16.     Label2: TLabel;
  17.     procedure Button1Click(Sender: TObject);
  18.   private
  19.     { Private declarations }
  20.   public
  21.     { Public declarations }
  22.   end;
  23. var
  24.   frm_Client: Tfrm_Client;
  25. implementation
  26. {$R *.dfm}
  27. procedure Tfrm_Client.Button1Click(Sender: TObject);
  28. var
  29.   cmd: string;
  30.   ASize, TotalSize: Int64;
  31.   AFileStream: TFileStream;
  32. begin
  33.   IdTCPClient1.Host := Edit1.Text; //连接主机
  34.   IdTCPClient1.Port := StrToIntDef(Edit2.Text, 9925); //端口
  35.   IdTCPClient1.Connect; //连接
  36.   try
  37.     IdTCPClient1.WriteLn('BEGIN'); //提示服务器开始接收
  38.     cmd := IdTCPClient1.ReadLn;
  39.     //以“|”符号分离文件名
  40.     SaveDialog1.FileName := Copy(cmd, Pos('|', cmd) + 1, Length(cmd));
  41.     if not SaveDialog1.Execute then
  42.     begin
  43.       IdTCPClient1.WriteLn('CANCEL'); //告诉服务器取消
  44.       IdTCPClient1.Disconnect; //断开连接
  45.       exit;
  46.     end;
  47.     TotalSize := StrToInt(Copy(cmd, 0, Pos('|', cmd) - 1)); //分离文件大小
  48.     //建立文件流准备接收
  49.     AFileStream := TFileStream.Create(SaveDialog1.FileName, fmCreate);
  50.     try //循环开始接受
  51.       repeat
  52.         IdTCPClient1.WriteLn(IntToStr(AFileStream.Size));//发送当前传输的位置
  53.         ASize := Min(TotalSize - AFileStream.Size, IdTCPClient1.RecvBufferSize);
  54.         //选择剩余大小和缓冲区大小小的一个作为传输的大小
  55.         IdTCPClient1.ReadStream(AFileStream, ASize); //接收流
  56.         StatusBar1.SimpleText := Format('当前传输位置%d/大小%d', [AFileStream.Size, TotalSize]);
  57.         Application.ProcessMessages;
  58.       until AFileStream.Size = TotalSize; //大小一致了表示结束
  59.     finally
  60.       AFileStream.Free; //释放文件流
  61.     end;
  62.     IdTCPClient1.WriteLn('END'); //提示服务器传输完成
  63.     StatusBar1.SimpleText := '传输完成...';
  64.   except
  65.     StatusBar1.SimpleText := '连接服务器失败或者对方已经中断传输!';
  66.   end;
  67.   IdTCPClient1.Disconnect;
  68. end;
  69. end.