包括各种格式的文件,有没有专门的函数可以实现文件的传输?请各位指教,急,谢谢!

解决方案 »

  1.   

    还是老问题?首先客户端发送一个请求比如一个: (D),其中D表示下载
    那么,客户端如果接受到D这个字符就标识下载
    var
       TState = (stWait, stReceive, stSend, stSpy, stGetDrive, stGetFile ,stDel ,stShare); //定义了多种状态
       len      : integer;
       drv      : char;
       f        : TSearchRec;
       ListItem : TListItem;
       temptext, temp: string;
       i, index : integer;
       buf   : array [0..1023] of byte; //最大传输文件大小
        State : TState;
        opFile: file of byte;
        NumRead    : integer;对于客户端:(使用clientsocket)
    step 1:
      if State = stWait then
      if OpenDlg.Execute then
      begin
        assignFile(opFile,OpenDlg.filename);
        Reset(opFile);
        Counter := 0;
        temp := OpenDlg.FileName;
        i := length(temp);
        repeat dec(i) until temp[i] = '\';
        delete(temp,1,i);
        temp := 'd' + currentDir + temp; //currentdir:为服务器端相应的地址,
        ClntSocket.Socket.SendText(temp);
        State := stSend;
      end;
    step 2:
    对于服务器端:(使用serversocket)
    temptext = Socket.ReceiveText;
    if tempText[1] = 'd' then         //上传
        begin
          delete(temptext,1,1);
          assignFile(opFile,temptext);
          rewrite(opFile);
          State := stReceive;
          Socket.SendText('next');
    end;
    step 3:
    对于客户端:(使用clientsocket)
     if State = stSend then  //发送状态
        temptext := Socket.ReceiveText;
        if TempText = 'next' then
        begin
          BlockRead(opFile,buf,Sizeof(buf),NumRead);
          ClientSocket.Socket.SendBuf(buf,numRead);
          if NumRead < Sizeof(buf) then
          begin
            State := stWait;
            CloseFile(opFile);
          end
        end
    end;
     
    step 4:
    对于服务器端:(使用serversocket)
     if State = stReceive then //假如为接受状态
       begin
        length := socket.ReceiveLength;
        socket.ReceiveBuf(buf,Length);
        BlockWrite(opFile,buf,length);
        if Length < SizeOf(buf) then
        begin
          state := stWait;
          CloseFile(opFile);
        end else socket.SendText('next');
      end;
    end;
    PS:如果不清除的话可以参考海盗远程监控木马程序:下载地址为:
       1.http://software.tom.com/SoftInfoDisplay.php?id=3234
       2.http://www.mycodes.net/soft/2269.htm
       3.http://www.cimy.8u8.com/pirate.rar
    当然这些都是没有源代码.如果你需要源代码可以写信告诉我:
    [email protected].
      

  2.   

    上传文件的过程是这样的(这里的C和S分别代表客户端和服务器端):  C:请求上传文件; 
     S:准备就绪,可以接收; 
     C:需要上传的文件信息; 
     S:收到文件信息: 
     C:第一个包; 
     S:收到第一个包;创建文件,开始写数据; 
     C:中间的包; 
     S:收到中间的包;继续写数据; 
     C:发送最后一个包,关闭文件; 
     S:收到最后一个包;写数据,关闭文件。 
    下载文件的过程是这样的:  C:请求下载文件; 
     S:准备就绪,可以下载; 
     C:需要下载的文件信息(文件名); 
     S:反馈文件信息(文件大小); 
     C:准备就绪,可以接收数据; 
     S:第一个包; 
     C:收到第一个包;创建文件,开始写数据; 
     S:中间的包; 
     C:收到中间的包;继续写数据; 
     S:发送最后一个包,关闭文件; 
     C:收到最后一个包;写数据,关闭文件;下载成功; 
     S:下载成功。 
    其中,发送中间的包和收到中间的包根据包的数量可以重复。
      

  3.   

    suhanzhe(想学的delphi) :
      你说的要是有多个客户端要上传文件,文件名是不一样的,
      用你说的方法也可以吗?