TIDClient 控件 可以向 服务器 主动发送信息,服务器TIDServer 有OnExecute 事件函数可以接收来自 client的数据,同时在OnExecute 事件函数中server可以
向client 发数据,但是 server 主动向 client 发数据,client 怎么知道??如何接收???

解决方案 »

  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;
         tmpXml          :IXMLDocument ;
      protected
         procedure Execute; override;
      public
         constructor Create;
         destructor  Destroy;override;
      end;implementationuses Frm_Waiting, Frm_Main, FBase, Frm_Error;
    { TGetData }procedure TGetData.Execute;
    type
      TTestMethod = procedure (StreamData:TMemoryStream) of object;
    var
      WaitFormHandle     ,
      WaitingFormHandle  : THandle;
      rstint             : integer;
      rststr             : string;
      messages           ,
      commandid          :string;
      i                  ,
      NowReadSize        ,
      TotalSize          :integer;
      vWinControl: TWinControl;
      vMethodAddress: Pointer;
      vMethod: TMethod;
    begin
      { Place thread code here }
       CoInitialize(nil);
       while (not Terminated)  do
             begin
               rstint  :=  0;
               if  not FrmMain.tcConn.Connected  then
                   begin
                   Terminate  ;
                   exit;
                   end;
               try
                 TotalSize:=strtoint(FrmMain.tcConn.ReadLn);
                 i:=3;
                 StreamData.SetSize(0);
                 FrmMain.tcConn.ReadStream(StreamData,FrmMain.tcConn.ReadInteger ,false);
                 StreamData.Seek(0,soFromBeginning);
                 GetStreamData.CopyFrom(StreamData,StreamData.Size);
                 StreamData.SaveToFile('1.xml');
                 GetStreamData.SaveToFile('2.xml');
                 NowReadSize:= StreamData.Size ;
                 while  GetStreamData.Size < TotalSize do
                        begin
                         NowReadSize:= StreamData.Size ;
                         FrmMain.tcConn.ReadStream(StreamData,FrmMain.tcConn.ReadInteger ,false);
                         StreamData.Seek(0,soBeginning);
                         GetStreamData.WriteBuffer(StreamData,StreamData.Size);
                         GetStreamData.SaveToFile(inttostr(i)+'.xml');
                         inc(i);
                        end;
                 GetStreamData.Seek(0,soBeginning);
                 GetStreamData.SaveToFile('asdf.xml');
                 if GetStreamData.Size =TotalSize then
                    begin
                    tmpXml              :=  TXMLDocument.Create(nil);
                    tmpXml.XML.LoadFromStream(GetStreamData);
                    try
                    tmpXml.Active       :=  true;
                    rstint              :=  tmpXml.DocumentElement.Attributes['RstInt'] ;
                    commandid           :=  tmpXml.DocumentElement.Attributes['CommandID'];
             //     rststr              :=  Base64Decoder(tmpXml.DocumentElement.Attributes['RstStr']);
                    rststr              :=  tmpXml.DocumentElement.Attributes['RstStr'];
                    WaitingFormHandle   :=  tmpXml.DocumentElement.ChildNodes[0].ChildNodes[0].Attributes['Value'];
                    WaitFormHandle      :=  tmpXml.DocumentElement.ChildNodes[0].ChildNodes[1].Attributes['Value'];
                    if  commandid <>'SendMessage' then
                        begin
                           vWinControl := FindControl(WaitingFormHandle);
                           if not Assigned(vWinControl) then Exit;
                           vMethodAddress := vWinControl.MethodAddress('GetResult');
                           if not Assigned(vMethodAddress) then Exit;
                           vMethod.Code := vMethodAddress;
                           vMethod.Data := vWinControl;
                           TTestMethod(vMethod)(GetStreamData);
                        end;
                    //PostMessage(WaitingFormHandle,wm_Result,rstint,WaitFormHandle);
                    finally
                    tmpXml.Active       :=  false;
                    end;
                    GetStreamData.SetSize(0);
                    end;
                 except
                 end;
             end;
       CoUnInitialize;
    end;constructor TGetdata.Create ;
    begin
       freeonterminate    :=  true;
       StreamData        :=  TMemoryStream.Create ;
       GetStreamData      :=  TMemoryStream.Create;
       GetStreamData.SetSize(0);
       ADODataSet1  :=TADODataSet.Create(nil);   inherited create(true);
    end;destructor  TGetdata.Destroy;
    begin
       FreeAndNil(GetStreamData);
       FreeAndNil(StreamData);   inherited  Destroy;
    end;
    end.