文件上传下载接收端

接收端:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, ComCtrls, ScktComp, ToolWin;

type
  TDataFlag=record
     FileName:string;
     Filesize:integer;
     WorkFlag:integer;
   end;
  PDataFlag=^TDataFlag; 
  TForm1 = class(TForm)
    ToolBar1: TToolBar;
    StatusBar1: TStatusBar;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ToolButton3: TToolButton;
    ToolButton4: TToolButton;
    ToolButton5: TToolButton;
    sv: TServerSocket;
    Panel1: TPanel;
    RichEdit1: TRichEdit;
    Splitter1: TSplitter;
    Lv1: TListView;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure ToolButton3Click(Sender: TObject);
    procedure ToolButton4Click(Sender: TObject);
    procedure ToolButton1Click(Sender: TObject);
    procedure ToolButton2Click(Sender: TObject);
    procedure ToolButton5Click(Sender: TObject);
    procedure svAccept(Sender: TObject; Socket: TCustomWinSocket);
    procedure svClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure svClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure svClientError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure svClientRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
const bufsize=4096;
var
  stream:Tmemorystream;
  working:boolean;
  sendport:integer;
{$R *.dfm}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  sv.Active:=false;
  sv.Close;
  stream.Clear;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   stream:=Tmemorystream.Create;
   stream.Position:=0;
   working:=false;
end;

procedure TForm1.ToolButton3Click(Sender: TObject);
begin
  working:=false;
  sv.Port:=6768;
  sv.Active:=true;
  stream.Clear;
  richedit1.Lines.Add(datetimetostr(now())+'==>>文件传送服务器启动!');
  
end;

procedure TForm1.ToolButton4Click(Sender: TObject);
begin
 if lv1.Items.Count =0 then
    exit;
  stream.Clear;
  working:=false;
  sv.Socket.Connections[sendport].SendText('filetransferstop');
  richedit1.Lines.Add(datetimetostr(now())+'==>>停止当前接受任务!');
end;

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
  caption:='start';
  stream.Clear;
  working:=true;
  sv.Socket.Connections[sendport].SendText('filetransferwork');
  richedit1.Lines.Add(datetimetostr(now())+'==>>开始接受文件。');
end;

procedure TForm1.ToolButton2Click(Sender: TObject);
begin
   working:=false;
   sv.Active:=false;
   stream.Clear;
   richedit1.Lines.Add(datetimetostr(now())+'==>>文件传送服务器停止!');
end;

procedure TForm1.ToolButton5Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.svAccept(Sender: TObject; Socket: TCustomWinSocket);
var
  newitem:TListItem;
begin
  newitem:=lv1.Items.Insert(lv1.Items.Count);
  newitem.Caption:='Client:'+inttostr(lv1.Items.Count);
  newitem.SubItems.Add(socket.RemoteHost);
  newitem.SubItems.Add(socket.RemoteAddress);
  newitem.SubItems.Add(inttostr(socket.RemotePort));
  lv1.AlphaSort;
  lv1.Items.Item[0].Selected:=true;
//  ('连接到:'+socket.RemoteAddress+'成功!');
//  showmessage('连接到:'+socket.RemoteAddress+'成功!');
end;

procedure TForm1.svClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  df:PDataFlag;
begin
  df:=new(PDataFlag);
  df.FileName:='';
  df.Filesize:=0;
  df.WorkFlag:=0;
  socket.Data:=df;
  socket.SendText('已经连接,请准备好要传输的文件!');
  richedit1.Lines.Add(datetimetostr(now())+'==>>文件传送服务连接用户:'+socket.RemoteAddress);
  
end;

procedure TForm1.svClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  i:integer;
begin
  for i:=0 to lv1.Items.Count - 1 do
    if lv1.Items.Item[i].SubItems.Strings[2]=inttostr(Socket.RemotePort) then
      begin
       richedit1.Lines.Add(Datetimetostr(now())+'==>>'+lv1.Items[i].Caption+'走了!');
       lv1.Items.Item[i].Delete;
       exit;
      end;
end;

procedure TForm1.svClientError(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  errorcode:=0;
  working:=false;
  stream.Clear;
end;

procedure TForm1.svClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  buf:array[0..bufsize] of char;
  numberbytes,i:integer;
  df:PDataFlag;
  cmd:string;
begin
  df:=socket.Data;
  case df.WorkFlag of
    0:
      begin
        cmd:=trim(socket.ReceiveText);
        if pos('FILESEND ',uppercase(cmd))>0 then
          begin
            df.FileName:=trim(copy(cmd,pos(' ',cmd)+1,length(cmd)));
            df.Filesize:=strtoint(copy(df.FileName,pos(' ',df.FileName)+1,length(df.FileName)));
            df.FileName:=trim(copy(df.FileName,1,pos(' ',df.FileName)));
            df.WorkFlag:=1;
            socket.Data:=df;
            socket.SendText('文件传送服务准备完毕,可以传送!');
            richedit1.Lines.Add(datetimetostr(now())+'==>>文件名:'+df.FileName+' 文件大小:'+inttostr(df.Filesize)+#13#10+'文件传送服务准备完毕,可以接受了!');
          end;
      end;
     1:
       begin
          if working then
            begin
               //if socket.RemoteHost then
               numberbytes:=socket.ReceiveLength;
               socket.ReceiveBuf(buf,numberbytes);
               stream.Write(buf,numberbytes);
               if numberbytes>=bufsize then socket.SendText('filetransferwork');
               if numberbytes<bufsize then
                begin
                   socket.SendText('filetransferstop');
                   stream.Position:=0;
                   try
                     stream.SaveToFile(df.FileName);
                     richedit1.Lines.Add(datetimetostr(now())+'==>>文件接受完毕!');
                     df.WorkFlag:=0;
                     socket.SendText('文件传送服务器准备完毕,可以传输下一个文件!');
                   except

                   end;
                   stream.Clear;
                end;
               end;
            end;
         end;
      if not working then socket.SendText('filetransferstop');
    for i:=0 to lv1.Items.Count - 1 do
    if lv1.Items.Item[i].SubItems.Strings[2]=inttostr(Socket.RemotePort) then
      begin
         sendport:=i;
      end;
end;

end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值