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

📄 unitserver.pas

📁 局域网文件发送系统
💻 PAS
字号:
{本源码是自由程序,你可以把它用在任何地方,但不允许以任何形式把它单独用作商业用途。

本人是一个普通的打工仔,为了给朋友们献上更好的源码和控件,我需要你的支持,如果你认为本程序对你有帮助,希望你寄任意你愿意数额的RMB给我以资鼓励和支持,如果你认为不值,也希望你寄一张PostCard或者一封Email对我予以支持。

深圳市福田区联合广场41楼恒星威电子有限公司GPS部 艾真保  收
518026

mailto:Aizb@163.net

HomePage:
  http://www.aidelphi.com}
unit UnitServer;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ScktComp, ExtCtrls;
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';
type
  TForm1 = class(TForm)
    SaveDialog1: TSaveDialog;
    ss: TServerSocket;
    Memo1: TMemo;
    procedure ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    fsRecv:TFileStream;
    bStart:Boolean;
    TickCount:Longword;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation


{$R *.DFM}

procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  sTemp,sFileName:string;
  bufRecv:Pointer;
  iLength:Integer;
begin
  iLength:=Socket.ReceiveLength;
  GetMem(bufRecv,iLength);
  try
    Socket.ReceiveBuf(bufRecv^,iLength);   //
    sTemp:=StrPas(PChar(bufRecv));
    //如果传入的数据有可能不是字符串,需要用其他方式处理,则这里不能及Socket.ReceiveText方法取数据出来检查,
    //因为这个方法会清空接收缓冲区,也就是说在执行Socket.ReceiveText方法后,Socket.ReceiveLength将会返回0,
    //ReceiveBuf方法也不会取到正确数据。ReceiveBuf方法也是一样的!
    //所以在取数据前一定要先把长度取出来,保存在一个变量中。

    //请注意判断第一个字符的方法有可能出问题,有可能传送文件的时候正好当前传送段的数据的第一个字节是一个0-9之间的字符。可能会出错。
    sTemp:=Copy(sTemp,1,5);
    if sTemp=MP_QUERY then
    begin
      sTemp:=Trim(StrPas(PChar(bufRecv)));
      sFileName:=ExtractFileName(Copy(sTemp,6,Length(STemp)));
      //在这里拒绝
      SaveDialog1.Title:='请选择或输入接收到的数据保存到的文件名:';
      SaveDialog1.FileName:=sFileName;
      if SaveDialog1.Execute then
      begin
        fsRecv:=TFileStream.Create(SaveDialog1.FileName,fmCreate);
        //如果愿意接收数据。
        memo1.Lines.Add ('开始接收!');//??????
        TickCount:=GetTickCount;
        Socket.SendText(MP_ACCEPT);
        //通知发送端发送数据。
        bStart:=False;
      end
      else
        Socket.SendText(MP_REFUSE+'去死');
    end else if sTemp=MP_FILEPROPERTY then
    begin
      //要发送StrToInt(Copy(sTemp,2,Length(sTemp))) 次
      //时间进度显示。。。
      //iRecvLength:=StrToInt(Copy(sTemp,2,Length(sTemp)));//;1024
      Socket.SendText(MP_NEXTWILLBEDATA);
      //接收文件长度并要求继续传送数据。
    end else if sTemp=MP_NEXTWILLBEDATA then
    begin
      Socket.SendText(MP_DATA);
      //要求发送端发送数据。
      //准备好接收数据。
    end else if sTemp=MP_OVER then
    begin
      memo1.Lines.Add ('MP_OVER');//??????
      fsRecv.Free;
    end else if sTemp=MP_END then//文件传送结束。
    begin
      memo1.Lines.Add ('结束!'+IntToStr(GetTickCount-TickCount));//??????
      fsRecv.Free;
    end else if sTemp=MP_ABORT then
    begin
      memo1.Lines.Add ('MP_ABORT');//??????
      fsRecv.Free;
    end else if sTemp=MP_CHAT then
    begin
      //Chat Msg
    end else
    begin
      if not bStart then
      begin
        memo1.Lines.Add('接收数据...');//??????
        bStart:=True;
      end;
      fsRecv.WriteBuffer(bufRecv^,iLength);//
      Socket.SendText(MP_NEXTWILLBEDATA);
    end;
  finally
    FreeMem(bufRecv,iLength);
    //FreeMem(bufRecv,2000);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear;
  ss.Port:=2000;
  ss.Open;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ss.Close;
end;

end.

⌨️ 快捷键说明

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