Q&A

  • TCP/IP 통신 관련 문제
안녕하세요.
지금 장비와 TCP/IP 통신을 사용하여 데이터를 받는 프로그램을 개발하고 있습니다.
컴포넌트는 IndyClient를 사용하구 있구요..
그런데 아래 첨부한 코드를 사용해서 'SEND' 버튼을 이용하여 명령어를 보내면 한번은  Client 소켓에 쓰는데 한번은 소켓에 쓰지 못해 데이터를 받을 수 없습니다.
(TClientHandleThread.Execute 루틴은 두번 중 한번밖에 들어오지 않음)
예전엔 이런 방법으로 데이터를 받았던거 같은데.. 뭐가 문젠지 모르겠습니다.
빠른 답변 부탁드립니다.
감사합니다.


unit MainForm;

interface

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

const
  CRLF = #13#10;

type
  TClientHandleThread = class(TThread)
  private
    FMsg : string;
    procedure HandleInput;

  protected
    procedure Execute;override;
  public
  end;

type
  TFormMain = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    LEdit_IP: TLabeledEdit;
    LEdit_Port: TLabeledEdit;
    Button2: TButton;
    Edit_CMD: TEdit;
    Button3: TButton;
    IdTCPClient: TIdTCPClient;
    Memo: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure IdTCPClientConnected(Sender: TObject);
    procedure IdTCPClientDisconnected(Sender: TObject);
  private
    { Private declarations }
  public
    FClientThread : TClientHandleThread;
    FCurrCMD : string;
    { Public declarations }
  end;

var
  FormMain: TFormMain;

implementation

{$R *.dfm}

//=================================================================
// Thread 부분
//=================================================================
procedure TClientHandleThread.Execute;
begin
  try
          while not Terminated do
          begin
                   FMsg := FormMain.IdTCPClient.ReadLn;
                        Synchronize(HandleInput);
          end;
        except
                Terminate;
        end;
end;

procedure TClientHandleThread.HandleInput;
begin
  FormMain.Memo.Lines.Add(FMsg)
end;

//=================================================================
// Form Main
//=================================================================

procedure TFormMain.Button1Click(Sender: TObject);
begin
  Close;
end;

// 'SEND' 버튼
procedure TFormMain.Button3Click(Sender: TObject);
begin
  FCurrCMD := Trim(Edit_CMD.Text) + CRLF;
  IdTCPClient.WriteLn(FCurrCMD);       //클라이언트 소켓에 쓰기...
end;

procedure TFormMain.Button2Click(Sender: TObject);
begin
  if IdTCPClient.Connected then
  begin
    IdTCPClient.Disconnect;
  end
  else
  begin
    IdTCPClient.Host := Trim(LEdit_IP.Text);
    IdTCPClient.Port := StrToInt(Trim(LEdit_Port.Text));
    IdTCPClient.Connect(10000);
  end;
end;

procedure TFormMain.IdTCPClientConnected(Sender: TObject);
begin
  FClientThread := TClientHandleThread.Create(True);
  FClientThread.FreeOnTerminate:=True;
  FClientThread.Resume;

  Button2.Caption := '연결해제';
end;

procedure TFormMain.IdTCPClientDisconnected(Sender: TObject);
begin
  if Assigned(FClientThread) then FClientThread.Terminate;

  Button2.Caption := '연결';
end;

end.

0  COMMENTS
  • profile SKY
    2007/02/01 20:59
  • Views1275
    Likes0
    Comments0
    Reports0
  • Tag List
  • 목록으로