📄 ss.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 + -