Q&A

  • Indy 를 이용한 소켓통신에 관한 질문입니다..
자료실에 어떤 예제를 보고 따라해본것인데..
예제가 파일하나만 송신하는것을 2개이상 송신하게끔 바꿔보았는데...
쓰레드에 대한 지식이 미흡해 진전을 보지 못하고 있습니다...
바쁘시더라도 한번 검토 해 봐 주세요...
다음은 클라이언트 쪽의 소스 입니다...서버쪽은 바꾸지 않아도 될것같아 그대로 사용 했구요...
unit Client;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IniFiles, Gauges, XSocket;
type
  TMyThread = class(TThread)
  private
    Msg: Pekit;
    FinishChk : Boolean;
    procedure View;
  public
    procedure Execute; override;
  end;

  TForm1 = class(TForm)
    IdTCPClient1: TIdTCPClient;
    ClientGauge: TGauge;
    Button2: TButton;
    ListBox1: TListBox;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    MyThread: TMyThread;
  public
    { Public declarations }
    gHost, gPort, gUserID, gPassword : string;
    gExeFile, gPath : string;
    gFile           : String; //압축파일이름
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TMyThread.View;
begin
  if Msg.msg = mtText Then
    Form1.Memo1.Lines.Add(strpas(Msg.Data))
  else if (Msg.msg - mtSSFileNM) in [0..2] Then
  begin
    Send2UFile(Form1.IdTCPClient1, Msg);
    Form1.ClientGauge.MaxValue := Msg.f_1;
    Form1.ClientGauge.Progress := Msg.f_2;
  end
  else if (Msg.msg - mtSSFileST) in [0..3] Then
    Recv2UFile(Form1.IdTCPClient1, Msg, FinishChk);
end;

procedure TMyThread.Execute;
begin
  while (not Terminated) And (not FinishChk) do
  begin
    try
      FillChar(Msg, mtLens, 0);
      Form1.IdTCPClient1.ReadBuffer(Msg, mtLens);
      Synchronize(View);
    except
      Terminate;
    end;
  end;

end;

procedure TForm1.FormCreate(Sender: TObject);
const
   IniName = 'Downcfg.ini';
var
   DBCFG: TIniFile;
   ExePath : String;
   i : integer;
begin
   DBCFG     := TIniFile.Create(GetCurrentDir+'Downcfg.ini');
   gHost     := DBCFG.ReadString('DownLoad','FTPHOST','');
   gPort     := DBCFG.ReadString('DownLoad','PORT','');
   //gUserID   := DBCFG.ReadString('DownLoad','USERID','');
   //gPassword := DBCFG.ReadString('DownLoad','PASSWORD','');

   i := 1;
   while True do
   begin
      gExeFile := DBCFG.ReadString('DownLoad','ExeFile'+IntToStr(i),'');
      if Trim(gExeFile) <> '' then
      begin
         ListBox1.Items.Add(gExeFile);
         inc(i);
      end
      else break;
   end;
   if IdTCPClient1.Connected = False then
   begin
     IdTCPClient1.Host     := gHost;
     IdTCPClient1.Port     := StrToInt(gPort);
     //IdTCPClient1.UserID   := gUserID;
     //IdTCPClient1.Password := gPassword;

{    try
        IdTCPClient1.Connect;
        MyThread := TMyThread.Create(true);
        MyThread.FreeOnTerminate := true;
        MyThread.Resume;

        //IdTCPClient1.WriteLn('SEND');
        except On E:Exception do
        begin
           ShowMessage('FTP 서버 ' + gHost + ' 에 연결할 수 없습니다...' + #13#10 + E.Message);
           Exit;
        end;
     end; }
   end;

end;

procedure TForm1.Button2Click(Sender: TObject);
const
  BuffSize = 4062;
var
  Cmd : String;
  Buff : Array [0..BuffSize-1] of Char;
  CopySize : Integer;
  FStream : TFileStream;
  i : integer;
begin
{ Cmd := IdTCPClient1.ReadLn('',100);
  if Trim(Cmd) = 'PER' then
  begin
    for i := ListBox1.Items.Count - 1 downTo 0 do
    begin
       Send2U(IdTCPClient1, ListBox1.Items[i], mtSSFileST);
       try
       //  IdTCPClient1.WriteLn(ListBox1.Items[i]);
         FStream := TFileStream.Create(ListBox1.Items[i],fmOpenRead);
         ClientGauge.MaxValue := FStream.Size;

         while True do
         begin
           CopySize := FStream.Read(Buff,BuffSize);
           if CopySize <> 0 then
           begin
             IdTCPClient1.WriteBuffer(Buff,CopySize,True);
             ClientGauge.Progress := ClientGauge.Progress + CopySize;
           end
           else Break;
         end;
       finally
         FStream.Free;
       end;

    end;
  end
  else if Trim(Cmd) = 'DEN' then
  begin
     Showmessage('파일 전송 거절');
     IdTCPClient1.Disconnect;
  end;
  }
  for i := ListBox1.Items.Count - 1 downTo 0 do
  begin
     try
        IdTCPClient1.Connect;
        MyThread := TMyThread.Create(true);
        MyThread.FreeOnTerminate := true;  //Determines whether the thread object is
                                           //automatically destroyed when the thread terminates.
        MyThread.Resume;
        except On E:Exception do
        begin
           ShowMessage('FTP 서버 ' + gHost + ' 에 연결할 수 없습니다...' + #13#10 + E.Message);
           Exit;
        end;
     end;

    Send2U(IdTCPClient1, ListBox1.Items[i], mtSSFileST);

    MyThread.WaitFor;

    if MyThread.FinishChk then
      IdTCPClient1.Disconnect;
  end;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// MyThread.Free;
// IdTCPClient1.Disconnect;
end;
0  COMMENTS
    • 박상현
    • 2002.08.21 03:34
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.08.21 03:55
      안녕하세요. 최용일입니다. Drag 관련 속성과 이벤트를 사용하세요. 간단히 됩니다. 델파이 도움말에...
    • 이추형
      2002.08.24 20:38
      오렐리(O'rally)에서 나온책을 보시면 활용에 대한 많은 예제와 설명이 있습니다.
    • 델유저
      2006.12.12 02:47
      ...
    • 김의태
    • 2002.08.21 02:22
    • 5 COMMENTS
    • /
    • 0 LIKES
    • KDDG_Jo
      2002.08.21 02:37
      위쪽만 디자인및 코딩하신후 NeedData를 사용해보세여   private   &nbs...
    • 김의태
      2002.08.21 02:49
      죄송한데...안되는데요..ㅠ.ㅠ 똑같이 한번 해봤는데...그냥 똑같이 나와요..ㅠㅠ 에겅..어떻게 다시...
    • KDDG_Jo
      2002.08.21 02:54
      테스트를 먼저 한번해보세여 1. QuickRep1.HasDetail = True 2. DetailBand1에 QRLabel1을 하나...
    • 김의태
      2002.08.21 03:09
      되네요..ㅋㅋ 근데 디테일 밖에 안되네요... 페이지 헤더랑 풋터 모두 통째로 같이 두개 찍히게 하는...
    • ^ㅡ^
      2002.08.21 03:27
      도움이 될지 모르겠네요...... 그냥 페이지해더와 풋터를 없세고요 디텔에서 그냥 그리세요 반만...
    • byun
    • 2002.08.21 01:49
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 한하눌
      2002.08.21 06:55
      다음을 엑셀메크로에서 실행해보시면 힌트를 얻을수도 있겠네요 Sub Macro1()    &nb...
    • 윤정식
    • 2002.08.21 01:28
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 장태원
      2002.08.21 01:26
      에구..바보시네용..ㅡㅡ; tmainmenu 올려놓고 디자인하고 xpmenu 올리시면 됨. xpmenu 의 autodete...
    • 장태원
      2002.08.21 01:10
      아마도. .inttostr( ) 사용하시면 될듯...맞나..에구..ㅡㅡ;
    • ㄴ ㅏ ㅁ ㅑ
      2002.08.21 01:40
      헤헤 실수형이니깐 FloatToStr 을 썼더니 되더라구여. 쫌더 생각해보고 질문하는 습관을 길러야겠어...
    • 이창환
      2002.08.22 02:17
      제가 볼때.. 로직상의 문제로 보이거든요.. 전에도 이런문제로 찾아 보았는데.. 무한 루프일 가능성.. 프...
    • 석재명
      2002.08.21 14:08
      Oracle의 파라미터 화일에서(init[sid].ora file) OPEN_CURSORS 라는 항목의 숫자를 늘려주면 됩니다.
    • 코난
    • 2002.08.20 23:46
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이추형
      2002.08.24 18:42
      오라클에서 그런메세지는 나옵니다. 이럴경우 서버의 상태가 Busy해서 많은 응답을 할수 없을때 입니다. ...
    • 하늘벌레
      2002.08.21 00:50
      edit2.text:=edit1.text  <==이렇게 하심 덮어 써지구요 edit2.text:=edit2.text+edit1.te...
    • ㄴ ㅏ ㅁ ㅑ
      2002.08.21 01:03
      제가 너무 생각을 하다보니 저두 정리가 잘 안되네요 딴데서 문제였던것 같습니다. ㅎㅎ... 아무튼 감...
    • 델사랑
    • 2002.08.20 23:34
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 장태원
      2002.08.21 01:12
      Tbatchmove 를 사용하세요.. mode 를 batAppendUpdate 로 하시고용. 그럼 추가 수정 자동으로 올라...
    • 델사랑
      2002.08.21 01:39
      처음에 데이타를 올릴때 어떻게 해야되요? 한달동안 저장된 데이타를 맨처음으로 서버에 올릴때 어떻하죠?...
    • 김재준
    • 2002.08.20 23:22
    • 1 COMMENTS
    • /
    • 0 LIKES
    • KDDG_Jo
      2002.08.21 01:45
      Align 속성을 alNone 되있는지 확인하신후 width 와 height 를 변경하면 크기를 조절할수 있습니다.
    • 천상천하
      2002.08.21 00:14
      Uses ..., Printers; // 미리보기 폼을 가지고 사용한 것 입니다. // PrintDialog 이용시 procedure...
    • 손광현
    • 2002.08.20 22:35
    • 2 COMMENTS
    • /
    • 0 LIKES
    • KDDG_Jo
      2002.08.21 01:25
          procedure FormCreate(Sender: TObject);   private   ...
    • 하늘벌레
      2002.08.21 00:46
      차라리 프로시저를 따로 정의하고 MouseDown 에서도 해당 프로시저를 호출하고 버튼클릭 이벤트에서...
    • 맑은물
    • 2002.08.20 07:09
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 장태원
      2002.08.21 01:24
      prepare 던가.. requestlive 던가... true 로 바꾸셈. 맞나몰겠네.
    • KDDG_Jo
      2002.08.21 01:52
      textOut을 이용하면 한셀에 여러줄을 나타낼 수 있습니다.
    • 김동욱
    • 2002.08.19 23:43
    • 1 COMMENTS
    • /
    • 0 LIKES
    • KDDG_Jo
      2002.08.21 02:28
      한번에 다 출력하기에는 힘들어 보이네여(메모리 문제일듯..) 2000건씩 나눠서 출력하시는게 좋겠네여