상세 컨텐츠

본문 제목

TIdHTTP 현재 받은 패킷 단위로 처리하고 싶을 때

프로그래밍/Delphi

by ryujt 2012. 9. 2. 20:25

본문

Indy 컴포넌트들이 사용하기 대단히 편리하게 잘 만들어져 있지만, 패킷 단위로 처리하고 싶은 요구사항 때문에 소켓으로 직접 작업하고는 했었습니다.  그러다가 오늘 문득 "TStream 클래스를 상속받아서 처리하면 간단하겠구나"하는 뒤 늦은 깨달음이 ㅠ.ㅠ


"없으면 만들어서 한다"가 기본 자세이다 보니, 쓸 때 없는 곳에 힘을 빼고 말았네요 ㅡ.ㅡ;


코드가 간단해서 설명은 생략합니다 ^^;  (메모장에는 다운로드가 끝난 다음에 한 거번에 표시됩니다)


unit _fmMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP, Vcl.StdCtrls;

type
  TfmMain = class(TForm)
    IdHTTP1: TIdHTTP;
    moMsg: TMemo;
    procedure IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCount: Int64);
    procedure FormCreate(Sender: TObject);
    procedure IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCountMax: Int64);
    procedure IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
  private
  public
  end;

var
  fmMain: TfmMain;

implementation

type
  THTTPSream = class (TStream)
  private
    FSize : int64;
    FPosition : int64;
  protected
    function GetSize: Int64; override;
  public
    constructor Create;

    function Read(var Buffer; Count: Longint): Longint; override;
    function Write(const Buffer; Count: Longint): Longint; override;
    function Seek(Offset: Longint; Origin: Word): Longint; overload; override;
    function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; overload; override;
  end;

{$R *.dfm}

procedure TfmMain.FormCreate(Sender: TObject);
var
  HTTPSream : THTTPSream;
begin
  HTTPSream := THTTPSream.Create;
  try
    IdHTTP1.Get('http://다운받은 데이터가 있는 주소', HTTPSream);
  finally
    HTTPSream.Free;
  end;
end;

procedure TfmMain.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
  //
end;

procedure TfmMain.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin
  fmMain.moMsg.Lines.Add(Format('AWorkCountMax: %d', [AWorkCountMax]));
end;

procedure TfmMain.IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  //
end;

{ THTTPSream }

constructor THTTPSream.Create;
begin
  inherited;

  FSize := 0;
  FPosition := 0;
end;

function THTTPSream.GetSize: Int64;
begin
  Result := FSize;
end;

function THTTPSream.Read(var Buffer; Count: Integer): Longint;
begin
  Result := 0;
end;

function THTTPSream.Seek(Offset: Integer; Origin: Word): Longint;
begin
  Result := FPosition;
end;

function THTTPSream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
begin
  Result := FPosition;
end;

function THTTPSream.Write(const Buffer; Count: Integer): Longint;
begin
  FSize := FSize + Count;
  fmMain.moMsg.Lines.Add(Format('Position: %d, Size: %d, Count: %d', [Position, Size, Count]));
end;

end.

관련글 더보기