
20.08.2012, 09:04
|
Прохожий
|
|
Регистрация: 23.01.2012
Сообщения: 10
Репутация: 10
|
|
Севрер (отдает файлы по запросу)
Код:
begin
FName:=copy(TSockData(Sock.Data)^.Rec,1,TSockData(Sock.Data)^.LenRec-1);
Delete(TSockData(Sock.Data)^.Rec,1 ,TSockData(Sock.Data)^.LenRec);
TSockData(Sock.Data)^.LenRec:=0;
FGive:=true;
FStream:=TMemoryStream.Create;
FStream.LoadFromFile(FName);
FStream.Position:=0;
p:=FStream.Memory;
Form1.Memo1.Lines.Add('Отдаю '+FName);
m:=FName+'#'+IntToStr(FStream.Size)+'#';
Form1.Memo1.Lines.Add('Размер файла '+IntToStr(FStream.Size));
Sock.SendText(IntToStr(Length(m))+'#'+m);
i:=0;
SendFile;
end;
procedure TTHreadSock.SendFile;
begin
i:=Sock.SendBuf(p^, FStream.Size);
Form1.Memo1.Lines.Add('Отдали '+IntToStr(i));
{if i=FStream.Size then }
begin
FStream.Free;
FGive:=false;
Form1.Memo1.Lines.Add('Отдача завершена '+FName);
end;
end;
и клиент(принимет запросившие файлы)
Код:
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
if lencom<>0 then
tmp:=Socket.ReceiveText
else tmp:=tmp+Socket.ReceiveText;
if not bool then
begin
if lencom=0 then begin
lencom:=strtoint(copy(tmp,1 , pos('#',tmp)-1));
delete(tmp,1 , pos('#',tmp));
Fname:= copy(tmp,1 , pos('#',tmp)-1);
delete(tmp,1 , pos('#',tmp));
FSize:= strtoint(copy(tmp,1 , pos('#',tmp)-1));
delete(tmp,1 , pos('#',tmp));
bool:=true;
buf:=TMemoryStream.Create;
buf.Position:=0;
end;
end else
end;
вот поток который проверяет наличие пришедшего текста
Код:
procedure TTt.Execute;
begin
Sleep(1000);
if bool then
Form1.wriiite;
end;
а вот запись файла в стрим
Код:
procedure TForm1.wriiite;
begin
k:=FSize-buf.Size;
tt:=copy(tmp, 1, k);
delete(tmp,1 ,length(tt));
buf.Write(tt[1], length(tt));
if buf.Size=FSize then
begin
buf.Position:=0;
buf.SaveToFile(fname);
buf.Free;
bool:=false;
lencom:=0;
end;
end;
|