各位大哥小弟想请问一下多线程的问题
我要同时接收别人发来的多个文件该怎么做啊?
用indy idtcpserver 

解决方案 »

  1.   

    使用indy的IdTcpServer,IdTcpclient传输文件 
    接受部分(有个用户和密码check,你取消就可以)
    procedure TTCP_Server.IdTCPServerExecute(AThread: TIdPeerThread);
    var
     FStream  : TFileStream;
     FileName  : String;
     CmdStr   : String;
    begin
      CmdStr :=AThread.Connection.ReadLn();
      if CompareStr(Copy(CmdStr,1,6),'<SEND>')=0 then
       begin //1
        Delete(CmdStr,1,6);
        Cmd := '上传文件';
        FileName := CmdStr;
        if FileExists(ExtractFilePath(Application.ExeName)+FileName) then
          DeleteFile(ExtractFilePath(Application.ExeName)+FileName);
        try
         FStream := TFileStream.Create(ExtractFilePath(Application.ExeName)+FileName,FmCreate);
         AThread.Connection.ReadStream(FStream,2048,true);
        Finally
         FStream.Free;
         AThread.Connection.Disconnect;
        end;
       end  //1
      else if CompareStr(Copy(CmdStr,1,6),'<AGET>')=0 then
       begin //2
        Delete(CmdStr,1,6);
        Cmd := '下载文件';
        FileName := CmdStr;
        if FileExists(ExtractFilePath(Application.ExeName)+FileName) then
          begin
           try
            FStream := TFileStream.Create(ExtractFilePath(Application.ExeName)+FileName,FmOpenRead);
            AThread.Connection.WriteStream(FStream,True,False);
           Finally
            FStream.Free;
            AThread.Connection.Disconnect;
           end;
          end
        else
          begin
           AThread.Connection.WriteLn('Failed');
           AThread.Connection.Disconnect;
          end;
       end //2
      else if CompareStr(Copy(CmdStr,1,6),'<USER>')=0 then
       begin //3
        Delete(CmdStr,1,6);
        User := UpperCase(Trim(DecryptString(CmdStr,20504))); //CmdStr;
        if CompareStr(User,'XDM')=0 then
          begin
           Memo1.Lines.Add('User: '+User);
           CmdStr :='';
          end
        else
          begin
           Memo1.Lines.Add('User: '+User+' 非法登陆,已关闭连接');
           CmdStr := '';
           AThread.Connection.WriteLn('<Failed>');
           AThread.Connection.Disconnect;
          end;
       end  //3
      else if CompareStr(Copy(CmdStr,1,6),'<PASS>')=0 then
       begin //4
        Delete(CmdStr,1,6);
        Password := DecryptString(CmdStr,20504); //CmdStr;
        if CompareStr(Password,'123abc')=0 then
          begin
           Memo1.Lines.Add('Login..........Accepted');
           Memo1.Lines.Add('Connected......'+DateTimeToStr(Now));
           CmdStr := '';
           AThread.Connection.WriteLn('<Accepted>');
          end
        else
          begin
           Memo1.Lines.Add('Password Wrong...Login Failure');
           AThread.Connection.WriteLn('<Failed>');
           CmdStr :='';
           AThread.Connection.Disconnect;
          end;
       end;  //4
    end;主要发送部分
    procedure TTCP_Client.BtnSendClick(Sender: TObject);
    var
     FStream : TFileStream;
    begin
     if IdTcpClient.Connected then begin
       IdTcpClient.WriteLn('<SEND>'+ExtractFileName(FileName));
       if FileName = '' then
        MessageBox(Handle,'没有选择文件','Error',MB_OK)
       else begin
          try
          FStream := TFileStream.Create(FileName,FmOpenRead);
          FStream.Position := 0;
          FStream.Seek(0,0);
          IdTcpClient.WriteStream(FStream,true,false);
          Finally
          FStream.Free;
          IdTcpClient.Disconnect;
          end;
          Memo1.Lines.Add('Transferred OK');
         end;
     end
     else
      begin
       MessageBox(Handle,'没有连接服务器','Error',MB_Ok);
      end;
    end; 
      

  2.   

    indy idtcpserver 自动为每个客户端创建一个独立线程,接收代码写在线程里就可以了。
      

  3.   

    我也知道indy idtcpserver 是自动为每个客户端创建一个独立线程
    但是他在AThread只是处理一个线程的吧
    我现在是发送端发给客户端我选择一个文件正在接收
    我再选择另一个的时候
    他就会提示already connect