Q&A

  • Indy - 간단한 채팅프로그램
code way의 메신저 강좌를 따라하다가 잘안되어서 문의 드립니다.
소스는 아래와 같구요...
ReceiveText 함수중
        IdTCPClient.ReadBuffer(Data^, DataSize);
부분에서 멈춰버리네요...

도움의 손길을 기다립니다.

----------------------

unit uClient;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Edit1: TEdit;
    Button1: TButton;
    IdTCPClient1: TIdTCPClient;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure IdTCPClient1Connected(Sender: TObject);
    procedure IdTCPClient1Disconnected(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function ReceiveText(IdTCPClient: TIdTCPClient): string;
var
    Data: Pointer;
    DataSize: integer;
    ssData: TStringStream;
begin
    DataSize := IdTCPClient.ReadFromStack(True, 5, False);
    if DataSize = 0 then
    begin
        Result := '';
        exit;
    end;

    GetMem(Data, DataSize);
    ssData := TStringStream.Create('');
    try
        IdTCPClient.ReadBuffer(Data^, DataSize);
        ssData.Write(Data^, DataSize);
        ssData.Position := 0;
        Result := ssData.DataString;
    finally
        FreeMem(Data);
        ssData.Free;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if IdTCPClient1.Connected then
  begin
    IdTCPClient1.Disconnect;
    Button1.Caption := '접속';
  end
  else
  begin
    IdTCPClient1.Connect;
    Button1.Caption := '해제';
  end;
end;

procedure TForm1.IdTCPClient1Connected(Sender: TObject);
begin
  Self.Caption := 'Connect';
end;

procedure TForm1.IdTCPClient1Disconnected(Sender: TObject);
begin
  Self.Caption := 'DisConnect';
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Not IdTCPClient1.Connected then exit;
  if key = #13 then
  begin
    key := #0;
    IdTCPClient1.WriteLn(Edit1.Text);
    Edit1.Text := '';
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  MyStr: string;
begin
  if Not IdTCPClient1.Connected then exit;

  // Indy의 버그
  {
  MyStr := IdTCPClient1.ReadLn(#10, 5);  // #10 = #$A
  }

  MyStr := ReceiveText(IdTCPClient1);

  if Mystr <> '' then Memo1.Lines.Add(MyStr);
1  COMMENTS
  • Profile
    조광태 2007.05.26 07:37

    제가 약간 경험이 있는데 인디 9버전의 경우에는
    9버전대의 최고버전(아마 9.18일겁니다)이 아니면
    채팅 프로그램 중간에 멈춥니다.
    인디를 9버전대 최고버전으로 다시 설치해 보세요.