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

P2P编程

开发平台:

Delphi

  1. unit U_Server;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent, IdTCPServer, Math;
  6. type
  7.   Tfrm_Server = class(TForm)
  8.     IdTCPServer1: TIdTCPServer;
  9.     Button1: TButton;
  10.     Button2: TButton;
  11.     Button3: TButton;
  12.     ProgressBar1: TProgressBar;
  13.     StatusBar1: TStatusBar;
  14.     Edit1: TEdit;
  15.     Button4: TButton;
  16.     OpenDialog1: TOpenDialog;
  17.     Edit2: TEdit;
  18.     Label1: TLabel;
  19.     Label2: TLabel;
  20.     procedure Button1Click(Sender: TObject);
  21.     procedure Button4Click(Sender: TObject);
  22.     procedure Button2Click(Sender: TObject);
  23.     procedure Button3Click(Sender: TObject);
  24.     procedure IdTCPServer1Execute(AThread: TIdPeerThread);
  25.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  26.   private
  27.     AFileStream: TFileStream; //传输的文件流
  28.     procedure ButtonBegin;
  29.     procedure ButtonEnd;
  30.     { Private declarations }
  31.   public
  32.     { Public declarations }
  33.   end;
  34. var
  35.   frm_Server: Tfrm_Server;
  36. implementation
  37. {$R *.dfm}
  38. procedure Tfrm_Server.Button1Click(Sender: TObject);
  39. begin
  40.   if OpenDialog1.Execute then
  41.     Edit1.Text := OpenDialog1.FileName;
  42. end;
  43. procedure Tfrm_Server.Button4Click(Sender: TObject);
  44. begin
  45.   Close;
  46. end;
  47. procedure Tfrm_Server.Button2Click(Sender: TObject);
  48. begin
  49.   if not FileExists(Edit1.Text) then //检测文件是否存在
  50.   begin
  51.     Showmessage('文件不存在,请选择文件!');
  52.     //exit;
  53.   end
  54.   else
  55.   begin
  56.   //建立文件流
  57.   AFileStream := TFileStream.Create(Edit1.Text, fmOpenRead);
  58.   ProgressBar1.Max := AFileStream.Size;
  59.   ProgressBar1.Position := 0;
  60.   ButtonBegin; //VCL开始状态设置
  61.   //服务器准备好连接
  62.   IdTCPServer1.DefaultPort := StrToIntDef(Edit2.Text, 9925);
  63.   if not IdTCPServer1.Active then IdTCPServer1.Active := True;
  64.   end;
  65. end;
  66. procedure Tfrm_Server.ButtonBegin;
  67. begin //VCL开始状态设置
  68.   Button1.Enabled := False;
  69.   Button2.Enabled := False;
  70.   Button3.Enabled := True;
  71.   Button4.Enabled := False;
  72. end;
  73. procedure Tfrm_Server.ButtonEnd;
  74. begin //VCL结束状态设置
  75.   Button1.Enabled := True;
  76.   Button2.Enabled := True;
  77.   Button3.Enabled := False;
  78.   Button4.Enabled := True;
  79. end;
  80. procedure Tfrm_Server.Button3Click(Sender: TObject);
  81. begin
  82.   StatusBar1.SimpleText := '传输取消...';
  83.   AFileStream.Free; //释放文件流
  84.   ButtonEnd; //VCL结束状态设置
  85. end;
  86. procedure Tfrm_Server.IdTCPServer1Execute(AThread: TIdPeerThread);
  87. var
  88.   cmd: string; //接收到客户端的字符串信息
  89.   ASize: Integer; //需要传输的流大小
  90. begin
  91.   with AThread.Connection do //已经连街上的一个进程
  92.   begin
  93.     cmd := UpperCase(ReadLn); //客户端发送的命令字符串
  94.     if cmd = 'BEGIN' then //开始传输
  95.     begin
  96.       //告诉远程传输文件的大小和文件名
  97.       WriteLn(Format('%d|%s', [AFileStream.Size, ExtractFileName(Edit1.Text)]));
  98.       StatusBar1.SimpleText := '准备传输...';
  99.       Exit;
  100.     end;
  101.     if cmd = 'END' then
  102.     begin //传输完成
  103.       Button3.Click;
  104.       StatusBar1.SimpleText := '传输完成...';
  105.       Exit;
  106.     end;
  107.     if cmd = 'CANCEL' then
  108.     begin //传输取消
  109.       StatusBar1.SimpleText := '传输取消...';
  110.       //保持传输状态
  111.       Exit;
  112.     end;
  113.     //按照指定位置传输文件
  114.     AFileStream.Seek(StrToInT(cmd), soFromBeginning); //转到文件流传输的位置
  115.     ASize := Min(AFileStream.Size - AFileStream.Position, RecvBufferSize);
  116.     //计算需要发送的大小,Min()函数在Math单元
  117.     OpenWriteBuffer; //准备发送缓冲
  118.     WriteStream(AFileStream, false, false, ASize);
  119.     //注意这个函数的参数。
  120.     CloseWriteBuffer; //结束发送缓冲
  121.     StatusBar1.SimpleText := Format('当前传输位置%s/大小%d', [cmd, AFileStream.Size]);
  122.     ProgressBar1.Position := ProgressBar1.Position + ASize;
  123.   end;
  124. end;
  125. procedure Tfrm_Server.FormClose(Sender: TObject; var Action: TCloseAction);
  126. begin
  127.   IdTCPServer1.Active := False;
  128. end;
  129. end.