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

📄 ss.pas

📁 Socket.ReceiveText Socket.ReceiveText
💻 PAS
字号:
unit ss;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;
 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)
    ss: TServerSocket;
    SaveDialog1: TSaveDialog;
    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;
 // memo1.Lines.Add (inttostr(iLength));
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)));
 memo1.Lines.Add (sTemp);
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;   //GetTickCount返回(retrieve)从操作系统启动到现在所经过(elapsed)的毫秒数,
//它的返回值是DWORD。
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 + -