Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   ejemplo streams (https://www.clubdelphi.com/foros/showthread.php?t=15952)

zastilla 10-11-2004 17:51:26

ejemplo streams
 
hola,
se que al poner este post voy a recibir muchas criticas, las cuales acepto ya por adelantado, siendo consciente de que cara a muchos soy un jeta por no preguntar cosas concretas sobre streams y pedir un ejemplo en codigo.

dicho esto necesitaria q alguien me mostrara el codigo para transferir por tcp un archivo de un servidor a un cliente y si no fuera mucha molestia que ademas sirviera para reanudar el stream en el punto en el q se quedo.
Tampoco pido todo mascado se q eso es imposible, pero si me gustaria que la forma del stream estuviera explicada.

pido el ejemplo ya que a traves de el, me es mas facil la comprension de los stream.
gracias

zastilla 11-11-2004 11:43:35

explico un poco mas
 
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


La franja horaria es GMT +2. Ahora son las 18:17:16.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi