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,我也是刚学,进来学习下