winsocket的参考一下 //服务器端接收来自客户端的信息 procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket); var msgr,theFileName:string; bufRecv:Pointer; iLength:Integer; begin //接收到的数据的长度 iLength:=Socket.ReceiveLength; //开辟一块新的内存,用来保存接收到的数据 GetMem(bufRecv,iLength); try //接收数据 Socket.ReceiveBuf(bufRecv^,iLength); //将接收到的数据以字符串的形式存到msgr中 msgr:=StrPas(PChar(bufRecv)); //取前5个字符 msgr:=Copy(msgr,1,5); if msgr=MP_QUERY then begin //去掉字符串前后的空格和控制字符 msgr:=Trim(StrPas(PChar(bufRecv))); //第5个字符后面的字符串为文件名 theFileName:=ExtractFileName(Copy(msgr,6,Length(msgr))); SaveDialog1.Title:='请选择或输入接收到的数据保存到的文件名:'; SaveDialog1.FileName:=theFileName; //点击确认保存按钮 if SaveDialog1.Execute then begin //为需保存的文件创建文件流 fsRecv:=TFileStream.Create(SaveDialog1.FileName,fmCreate); //如果同意接收数据。 memo1.Lines.Add ('开始接收!'); TickCount:=GetTickCount; //发送同意接收文件的信息 Socket.SendText(MP_ACCEPT); tStart:=False; end else //发送拒绝接收文件的信息 Socket.SendText(MP_REFUSE); end else if msgr=MP_FILEPROPERTY then begin //接收文件长度并说明主机可以接收数据了 Socket.SendText(MP_NEXTWILLBEDATA); end else if msgr=MP_NEXTWILLBEDATA then begin //要求发送端发送数据 Socket.SendText(MP_DATA); end else if msgr=MP_END then begin memo1.Lines.Add ('文件传送完成!'); memo1.Lines.Add ('接收耗时'+IntToStr(GetTickCount-TickCount)+'毫秒'); fsRecv.Free; end //接收到文件传送取消信息 else if msgr=MP_ABORT then begin memo1.Lines.Add ('MP_ABORT'); Socket.SendText(MP_ABORT); fsRecv.Free; end else begin if not tStart then begin memo1.Lines.Add('接收数据...'); tStart:=True; end; //将接收缓冲区数据写入文件 fsRecv.WriteBuffer(bufRecv^,iLength); //通知客户端继续发送数据 Socket.SendText(MP_DATA); end; finally //释放内存 FreeMem(bufRecv,iLength); end; end;
//服务器端接收来自客户端的信息
procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
msgr,theFileName:string;
bufRecv:Pointer;
iLength:Integer;
begin
//接收到的数据的长度
iLength:=Socket.ReceiveLength;
//开辟一块新的内存,用来保存接收到的数据
GetMem(bufRecv,iLength);
try
//接收数据
Socket.ReceiveBuf(bufRecv^,iLength);
//将接收到的数据以字符串的形式存到msgr中
msgr:=StrPas(PChar(bufRecv));
//取前5个字符
msgr:=Copy(msgr,1,5);
if msgr=MP_QUERY then
begin
//去掉字符串前后的空格和控制字符
msgr:=Trim(StrPas(PChar(bufRecv)));
//第5个字符后面的字符串为文件名
theFileName:=ExtractFileName(Copy(msgr,6,Length(msgr)));
SaveDialog1.Title:='请选择或输入接收到的数据保存到的文件名:';
SaveDialog1.FileName:=theFileName;
//点击确认保存按钮
if SaveDialog1.Execute then
begin
//为需保存的文件创建文件流
fsRecv:=TFileStream.Create(SaveDialog1.FileName,fmCreate);
//如果同意接收数据。
memo1.Lines.Add ('开始接收!');
TickCount:=GetTickCount;
//发送同意接收文件的信息
Socket.SendText(MP_ACCEPT);
tStart:=False;
end
else
//发送拒绝接收文件的信息
Socket.SendText(MP_REFUSE);
end
else if msgr=MP_FILEPROPERTY then
begin
//接收文件长度并说明主机可以接收数据了
Socket.SendText(MP_NEXTWILLBEDATA);
end
else if msgr=MP_NEXTWILLBEDATA then
begin
//要求发送端发送数据
Socket.SendText(MP_DATA);
end else if msgr=MP_END then
begin
memo1.Lines.Add ('文件传送完成!');
memo1.Lines.Add ('接收耗时'+IntToStr(GetTickCount-TickCount)+'毫秒');
fsRecv.Free;
end
//接收到文件传送取消信息
else if msgr=MP_ABORT then
begin
memo1.Lines.Add ('MP_ABORT');
Socket.SendText(MP_ABORT);
fsRecv.Free;
end
else
begin
if not tStart then
begin
memo1.Lines.Add('接收数据...');
tStart:=True;
end;
//将接收缓冲区数据写入文件
fsRecv.WriteBuffer(bufRecv^,iLength);
//通知客户端继续发送数据
Socket.SendText(MP_DATA);
end;
finally
//释放内存
FreeMem(bufRecv,iLength);
end;
end;