读书人

IdTCPClient怎么接收数据

发布时间: 2012-03-23 12:06:21 作者: rapoo

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

[解决办法]
使用线程接收

Delphi(Pascal) code
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.
[解决办法]
在客户端是不是要加Timer才行?
[解决办法]
IdTCPClient.ReadLn(),用线程来读取是不需要加timer的,Indy控件好像没有用WinSocket的异步事件机制, 它们都是采用的同步Socket,我也是刚学,进来学习下

读书人网 >.NET

热点推荐