?? unitserver.pas
字號:
{本源碼是自由程序,你可以把它用在任何地方,但不允許以任何形式把它單獨用作商業(yè)用途。
本人是一個普通的打工仔,為了給朋友們獻上更好的源碼和控件,我需要你的支持,如果你認(rèn)為本程序?qū)δ阌袔椭M慵娜我饽阍敢鈹?shù)額的RMB給我以資鼓勵和支持,如果你認(rèn)為不值,也希望你寄一張PostCard或者一封Email對我予以支持。
深圳市福田區(qū)聯(lián)合廣場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));
//如果傳入的數(shù)據(jù)有可能不是字符串,需要用其他方式處理,則這里不能及Socket.ReceiveText方法取數(shù)據(jù)出來檢查,
//因為這個方法會清空接收緩沖區(qū),也就是說在執(zhí)行Socket.ReceiveText方法后,Socket.ReceiveLength將會返回0,
//ReceiveBuf方法也不會取到正確數(shù)據(jù)。ReceiveBuf方法也是一樣的!
//所以在取數(shù)據(jù)前一定要先把長度取出來,保存在一個變量中。
//請注意判斷第一個字符的方法有可能出問題,有可能傳送文件的時候正好當(dāng)前傳送段的數(shù)據(jù)的第一個字節(jié)是一個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:='請選擇或輸入接收到的數(shù)據(jù)保存到的文件名:';
SaveDialog1.FileName:=sFileName;
if SaveDialog1.Execute then
begin
fsRecv:=TFileStream.Create(SaveDialog1.FileName,fmCreate);
//如果愿意接收數(shù)據(jù)。
memo1.Lines.Add ('開始接收!');//??????
TickCount:=GetTickCount;
Socket.SendText(MP_ACCEPT);
//通知發(fā)送端發(fā)送數(shù)據(jù)。
bStart:=False;
end
else
Socket.SendText(MP_REFUSE+'去死');
end else if sTemp=MP_FILEPROPERTY then
begin
//要發(fā)送StrToInt(Copy(sTemp,2,Length(sTemp))) 次
//時間進度顯示。。。
//iRecvLength:=StrToInt(Copy(sTemp,2,Length(sTemp)));//;1024
Socket.SendText(MP_NEXTWILLBEDATA);
//接收文件長度并要求繼續(xù)傳送數(shù)據(jù)。
end else if sTemp=MP_NEXTWILLBEDATA then
begin
Socket.SendText(MP_DATA);
//要求發(fā)送端發(fā)送數(shù)據(jù)。
//準(zhǔn)備好接收數(shù)據(jù)。
end else if sTemp=MP_OVER then
begin
memo1.Lines.Add ('MP_OVER');//??????
fsRecv.Free;
end else if sTemp=MP_END then//文件傳送結(jié)束。
begin
memo1.Lines.Add ('結(jié)束!'+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('接收數(shù)據(jù)...');//??????
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.
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -