Приветствую всех!
Меня до сих пор мучает проблема передачи файлов по схеме клиент-сервер. До Indy делал передачу через Socket, но файлы приходили до неузнаваемости битыми, а с Indy другая проблема - при получении файла от сервера, клиент намертво зависает.
Код сервера
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
IdTCPServer1.Active:=true;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
IdTCPServer1.Active:=false;
end;
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
S: string;
f: file of byte;
fs,fn: string;
mem:TmemoryStream;
begin
AssignFile(f,'news.zip');
Reset(f);
fs:=inttostr(FileSize(f));
fn:=ExtractFileName('news.zip');
CloseFile(f);
mem:=Tmemorystream.Create;
//--------------------------------------------------
S := AContext.Connection.IOHandler.ReadLn();
Memo1.Lines.Add('получена команда' + S);
//--------------------------------------------------
if SameText(S, 'dlmain') then
try
AContext.Connection.IOHandler.WriteLn('send_file');
AContext.Connection.IOHandler.WriteLn(fs);
AContext.Connection.IOHandler.WriteLn(fn);
mem.LoadFromFile('news.zip');
AContext.Connection.IOHandler.Write(mem);
mem.SaveToFile('news.zip');
finally
Memo1.Lines.Add('Передача файла');
end;
mem.Free;
end;
end.
Код клиента
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
comm,fs,fn:string;
mem: TmemoryStream;
begin
IdTCPClient1.IOHandler.WriteLn('dlmain');
mem:=Tmemorystream.Create;
comm:=IdTCPClient1.IOHandler.ReadLn();
Label1.Caption:=comm;
fs:=IdTCPClient1.IOHandler.ReadLn();
Label2.Caption:=fs;
fn:=IdTCPClient1.IOHandler.ReadLn();
Label3.Caption:=fn;
idTCPClient1.IOHandler.ReadStream(mem, -1, true);
mem.SaveToFile('news.zip');
mem.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
IdTCPClient1.Connect;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
IdTCPClient1.Disconnect;
end;
end.