Código:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, IdAntiFreezeBase, IdAntiFreeze,
IdTCPConnection, IdTCPClient, IdBaseComponent, IdComponent, IdTCPServer;
type
TForm1 = class(TForm)
IdTCPServer1: TIdTCPServer;
IdTCPClient1: TIdTCPClient;
IdAntiFreeze1: TIdAntiFreeze;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
ProgressBar1: TProgressBar;
Edit1: TEdit;
Label1: TLabel;
OpenDialog1: TOpenDialog;
Button5: TButton;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
procedure Button5Click(Sender: TObject);
procedure IdTCPClient1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
procedure IdTCPClient1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
private
{ Private declarations }
FConnectionCount: Integer;
FRequestCount: Integer;
public
{ Public declarations }
procedure IncrConnectionCount;
procedure DecrConnectionCount;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
idtcpserver1.Active:=true;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
opendialog1.Execute ;
edit1.Text := opendialog1.FileName;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
idtcpserver1.Active:=false;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Command : String;
SResponse: String;
AStream: TfileStream;
begin
with idTCPClient1 do
begin
Connect;
AStream := TfileStream.Create('c:\pepeddd.zip',fmCreate or fmOpenWrite );
try
// request OUTLINE data
WriteLn(edit1.text);
{ read all bytes until disconnected
no length marker in stream }
ReadStream(AStream, -1, true);
finally
Disconnect;
AStream.Free;
end;
end;
end;
procedure TForm1.idTCPServer1Execute(AThread: TIdPeerThread);
var
SRequest: String;
SOutline: String;
AStream: TfileStream;
begin
with AThread.Connection do
begin
AThread.Synchronize(IncrConnectionCount);
try
SRequest := UpperCase(ReadLn);
AStream := TfileStream.Create(srequest,fmOpenRead);
OpenWriteBuffer;
WriteStream(AStream);
CloseWriteBuffer;
AStream.Free;
finally
Disconnect;
AThread.Synchronize(DecrConnectionCount);
end;
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
idtcpclient1.Disconnect;
end;
procedure TForm1.IncrConnectionCount;
begin
Inc(FConnectionCount);
Inc(FRequestCount);
label2.Caption := IntToStr(FConnectionCount);
label3.Caption := IntToStr(FRequestCount);
end;
procedure TForm1.DecrConnectionCount;
begin
Dec(FConnectionCount);
label2.Caption := IntToStr(FConnectionCount);
label3.Invalidate;
end;
procedure TForm1.IdTCPClient1WorkBegin(Sender: TObject;
AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
progressbar1.Max:= AWorkCountMax;
end;
procedure TForm1.IdTCPClient1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
progressbar1.Position:= AWorkCount;
end;
end.
Es un adaptacion minima del ejemplo de las indy. he añadido un tedit para especificar el archivo q quiero mandar/recibir. tanto el servidor como el cliente estan en el mismo ejecutable para simplificar las cosas.
Bien he conseguido la primera parte pero cuando corto la comunicacion entre el servidor y el cliente el archivo que almacena se queda con un tamaño de 0 kb, hay alguna manera de evitar esto? ya que si quiero reanudar la descarga tendria q empezar desde el principio
que estoy haciendo mal para que la progressbar1 no funcione?
gracias