使用Idtcpserver 做服务器,客户端自动连接5010端口。 
想实现:
1、发送(1,sysinfo),当接收到的数据里包含sysinfo时取出机器的序列号
2、点开始下载的时候发送下载指令,接收到有返回数据时,下载文件。 根据返回的数据算出发送文件的块号    每一块512个字节只连接一台机器的时候程序没问题,现在想改成多台连接一起下载,线程的问题搞不清楚:
OnConnect事件:
var
    NewClient : pClient;
begin
    GetMem(NewClient,SizeOf(TClient));    NewClient.ClientIP := AThread.Connection.Socket.Binding.PeerIP;
    NewClient.FileID := 0;
    NewClient.Kuaihao := 0;
    NewClient.Thread := AThread;
    Sleep(100);
    AThread.Connection.WriteLn('(1,sysinfo)');
    AThread.Data := TObject(NewClient);
    try
        Clients.LockList.Add(NewClient);
    finally
        Clients.UnlockList;
    end;
    SB.Panels[1].Text :='服务已启动';
    CbbLanguage.Enabled := False;
    BtnBegin.Enabled := True;
    BtnCancle.Enabled := True;
end;
SendFile:
var
    i : integer;
    SFile, CurIP : String;
    RecClient : pClient;
    CommBlock : TCommBlock;
    CurThread : TIdPeerThread;
    PMark : Array[0..4] of byte;
begin
    SendMark := False;
    SFile := EdtFile.Text + IntToStr(FileID) + '.VOI';
    if not FileExists(SFile) then Exit;
    Fs := TFileStream.Create(SFile,fmOpenRead or fmShareDenyNone);
    PSize := Fs.Size div 512 ;
    if (Fs.Size mod 512) <> 0 then Inc(pSize);
    PMark[0] := $40;
    PMark[1] := PageBegin div 256;
    PMark[2] := PageBegin mod 256;
    PMark[3] := pSize div 256;
    PMark[4] := pSize mod 256;
    with Clients.LockList do
    begin
        for i:=0 to count-1 do
        begin
            RecClient := Items[i];
            CurIP := RecClient.ClientIP;
            if CurIP = CommBlock.RecIP then
            begin
                CurThread := RecClient.Thread;
                CurThread.Connection.WriteBuffer(pMark,sizeof(p)); //'400C000005'
            end;
        end;
    end;
end;
OnExecute事件:
var
    ActClient, RecClient : PClient;
    Buffsize, i, CurKuai : integer;
    GetID, sStr, CurIP : String;
    SMark : Array[0..3] of Byte;
    sReadByte : Array[0..9] of Byte;
    pbuf : Array[0..511] of Byte;
    Curthread: TIdPeerThread;
begin
    if not AThread.Terminated and AThread.Connection.Connected then
    begin
        with Clients.LockList do
        begin
            for i:=0 to Count-1 do
            begin
                Buffsize := AThread.Connection.ReadFromStack(True,-1,true);
                ActClient := PClient(AThread.Data);
                ActClient.FileID := CurFileID;
                CommBlock.RecIP :=  AThread.Connection.Socket.Binding.PeerIP;                RecClient := Items[i];
                CurIP := RecClient.ClientIP;
                if CurIP = CommBlock.RecIP then
                begin
                    if Buffsize > 10 then
                    begin
                        sStr := Athread.Connection.ReadLn;
                        if Pos('sysinfo',sStr) > 0 then
                        begin
                            GetID := Copy(sStr,2,8);
                            Memo1.Items.Add('ID:'''+GetID+'''Successed Link!');
                            CurFileID := 0;
                            SendFile(CurFileID);
                            Sleep(150);
                        end;
                    end
                    else if Buffsize = 2 then
                    begin
                        //CurThread := RecClient.Thread;
                        AThread.Connection.ReadBuffer(sReadByte,SizeOf(sReadByte));
                        if not((sReadByte[0]= $28) and (sReadByte[1]= $29)) then
                        begin
                            sleep(200);
                            if SendMark then
                            begin
                                SendMark := False;
                                Fs.Destroy;
                                sMark[0] := $23;    //#
                                sMark[1] := CurFileID;    //音频文件序号
                                sMark[2] := (PageBegin-pSize+1) div 256;     //文件起始地址
                                sMark[3] := (PageBegin-pSize+1) Mod 256;
                                Curthread := Recclient.Thread;
                                Curthread.Connection.WriteBuffer(sMark,SizeOf(sMark));     //'#+文件号+起始地址'
                                PBinfo.Progress := 0;
                                PBinfo.MaxValue := 26;
                                PBinfo.Progress := PBinfo.Progress + CurFileId;
                                SB.Panels[1].Text := '下载'+IntToStr(CurFileId)+'.VOI文件成功!';
                                Inc(CurFileID);
                                SendFile(CurFileID);
                                Inc(PageBegin);
                            end
                            else begin
                                CurKuai := sReadByte[0]*256+sReadByte[1];
                                if (Fs.Size-(CurKuai*512)) > 512 then
                                begin
                                    Fs.Seek(CurKuai*512,soFromBeginning);
                                    Fs.ReadBuffer(pBuf,512);
                                    CurThread := RecClient.Thread;
                                    CurThread.Connection.WriteBuffer(pBuf,512);
                                    Inc(PageBegin);
                                end
                                else if (Fs.Size-(CurKuai*512)) = 512 then
                                begin
                                    Fs.Seek(CurKuai*512,soFromBeginning);
                                    Fs.ReadBuffer(pBuf,512);
                                    CurThread := RecClient.Thread;
                                    CurThread.Connection.WriteBuffer(pBuf,512);
                                    SendMark := True;
                                end
                                else if (Fs.Size-(CurKuai*512)) = 512 then
                                begin
                                    Fs.Seek(CurKuai*512,soFromBeginning);
                                    Fs.ReadBuffer(pBuf,512);
                                    CurThread := RecClient.Thread;
                                    CurThread.Connection.WriteBuffer(pBuf,512);
                                    SendMark := True;
                                end;
                            end;//文件是否发送完成 _end
                        end;//收到的数据不包含括号的处理_end
                    end; // 返回数据大小判断的处理 _end
                end; //当前IP=接收IP_end
            end;  //连接几个客户端 for循环_end
        end;  //with _end
    end;  //线程连接上了_end
end;