⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unitclient.pas

📁 一个文件传输的程序
💻 PAS
字号:

unit UnitClient;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ScktComp, StdCtrls, Buttons, ExtCtrls, Menus, ImgList, ComCtrls;
Const
MP_QUERY ='11111';
MP_REFUSE ='22222';
MP_ACCEPT ='33333';
MP_NEXTWILLBEDATA='44444';
MP_DATA ='55555';
MP_ABORT ='66666';
MP_OVER ='77777';
MP_CHAT ='88888';
MP_END='99999';
MP_FILEPROPERTY='00000';
iBYTEPERSEND=1024;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    cs: TClientSocket;
    Memo1: TMemo;
    Panel1: TPanel;
    btnSendFile: TBitBtn;
    btnConnect: TBitBtn;
    edtIPAddress: TEdit;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    Image1: TImage;
    ImageList1: TImageList;
    SpeedButton1: TSpeedButton;
    StatusBar1: TStatusBar;
    procedure btnConnectClick(Sender: TObject);
    procedure btnSendFileClick(Sender: TObject);
    procedure csRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure FormCreate(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
  private
    fsSend: TFileStream;
    bStart:Boolean;
    TickCount:Longword;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.btnConnectClick(Sender: TObject);
begin
  cs.Address:=edtIPAddress.Text;
  cs.Port:=2000;
  cs.Open;
end;

procedure TForm1.btnSendFileClick(Sender: TObject);
begin
  if OpenDialog1.Execute then
  Begin
    cs.Socket.SendText(MP_QUERY+OpenDialog1.FileName);
    //接收端是否准备好!
  end;
end;

procedure TForm1.csRead(Sender: TObject; Socket: TCustomWinSocket);
var
  sRecv:string;
  bufSend:pointer;
  iLength:Integer;
begin
  sRecv:=Socket.ReceiveText;
  sRecv:=copy(sRecv,1,5);
  if sRecv=MP_REFUSE then
    memo1.Lines.Add('被拒绝!')
  else if sRecv=MP_ACCEPT then
  begin
    fsSend:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
    bStart:=False;
    memo1.Lines.Add('开始发送!');
    TickCount:=GetTickCount;
    //iBYTEPERSEND是个常量,每次发送包的大小。
    Socket.SendText(MP_FILEPROPERTY+inttostr(Trunc(fsSend.Size/iBYTEPERSEND)+1));
    //创建文件流并发送文件长度。
  end else if sRecv=MP_NEXTWILLBEDATA then
  begin
    Socket.SendText(MP_NEXTWILLBEDATA);
    //通知接收端。继续传送数据。
  end else if sRecv=MP_DATA then
  begin
    //发送数据。
    if not bStart then
    begin
      memo1.Lines.Add('正在发送数据。。。!');
      bStart:=True;
    end;
    if fsSend.Position< fsSend.Size-1 then//还有数据没有发送。
    begin
      iLength:=fsSend.Size-1-fsSend.Position;
      if iLength>iBYTEPERSEND then
        iLength:=iBYTEPERSEND;
      GetMem(bufSend,iLength+1);
      try
        fsSend.Read(bufSend^,iLength);
        Socket.SendBuf(bufSend^,iLength);
      finally
        FreeMem(bufSend,iLength+1);
      end;{of try}
    end else//没有数据需要发送了。
    begin
      Socket.SendText(MP_END);//文件传送结束。
      memo1.Lines.Add('结束!'+IntToStr(GetTickCount-TickCount));
      fsSend.Free;    //    <--------------------
    end;
  end else if sRecv=MP_ABORT then
  begin
    memo1.Lines.Add('中止!');
    //被取消了:(
    fsSend.Free;
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear;
end;

procedure TForm1.N5Click(Sender: TObject);
begin
messagedlg('欢迎使用文件传送程序的客户端,作者:赵龙(07201213)2004年8月',mtinformation,[mbok],0);
end;

procedure TForm1.N2Click(Sender: TObject);
begin
cs.Address:=edtIPAddress.Text;
  cs.Port:=2000;
  cs.Open;
end;

procedure TForm1.N3Click(Sender: TObject);
begin
 if OpenDialog1.Execute then
  Begin
    cs.Socket.SendText(MP_QUERY+OpenDialog1.FileName);
    //接收端是否准备好!
  end;
  end;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -