IdTCPClient如何自动接收服务端(硬件设备)发来的数据?怎样实现啊,最好能给出代码!

解决方案 »

  1.   

    使用线程接收unit t_Getdata;interfaceuses
      Classes,windows,SysUtils,VBase, xmldom, XMLIntf,msxmldom, XMLDoc ,ACTIVEX,ADODB,Controls,dialogs;type
      TGetData = class(TThread)
      private
        { Private declarations }
         GetStreamData   ,
         StreamData      :TMemoryStream;
      protected
         procedure Execute; override;
      public
         constructor Create;
         destructor  Destroy;override;
      end;implementationuses  Frm_Main, FBase, Frm_Error;{ TGetData }procedure TGetData.Execute;
    var
      TotalSize          :integer;
    begin
      { Place thread code here }
       StreamData        :=  TMemoryStream.Create ;
       while (not Terminated)  do
             begin
                 if  not FrmMain.tcConn.Connected  then
                     begin
                     Terminate  ;
                     exit;
                     end;
                 try
                 GetStreamData      :=  TMemoryStream.Create;
                 StreamData.SetSize(0);
                 TotalSize:=strtoint(FrmMain.tcConn.ReadLn);
                 FrmMain.tcConn.ReadStream(StreamData,FrmMain.tcConn.ReadInteger ,false);
                 StreamData.Seek(0,soFromBeginning);
                 GetStreamData.CopyFrom(StreamData,StreamData.Size);
                 while  GetStreamData.Size < TotalSize do
                        begin
                         StreamData.SetSize(0);
                         FrmMain.tcConn.ReadStream(StreamData,FrmMain.tcConn.ReadInteger ,false);
                         StreamData.Seek(0,soBeginning);
                         GetStreamData.WriteBuffer(StreamData,StreamData.Size);
                        end;
                 GetStreamData.Seek(0,soBeginning);
                 if  GetStreamData.Size <=0 then  Continue;
                 try
                       GetDataList.LockList.Add(GetStreamData);
                 Finally
                       GetDataList.UnlockList ;
                 end;
               finally
               end;
             end;
        FreeAndNil(StreamData);
    end;constructor TGetdata.Create ;
    begin
       freeonterminate    :=  true;
       inherited create(true);
    end;destructor  TGetdata.Destroy;
    begin
       inherited  Destroy;
    end;
    end.
      

  2.   

    在客户端是不是要加Timer才行?
      

  3.   

    IdTCPClient.ReadLn(),用线程来读取是不需要加timer的,Indy控件好像没有用WinSocket的异步事件机制, 它们都是采用的同步Socket,我也是刚学,进来学习下
      

  4.   


    这里的GetDataList.LockList.Add(GetStreamData);  GetDataList是啥我怎么编译不过