SOCKET编程问题,如何从一台计算机上COPY一个文件到另外一台计算机上?用DELPHI的SOCKET控件如何实现?

解决方案 »

  1.   

    我有一个此方面的例子,z_long#126.com
      

  2.   

    用一个系统API就可以搞定,效率高,具体忘了,是关于文件操作的,查一下资料应该找到的!代码不过5行的!
      

  3.   

    Server程序:
    放上以下控件:SaveDialog1,btnStartServer,
    ss,(TServerSocket)btnStartServer.OnClick(Sender:TObject);
    begin
      ss.Port:=2000;
      ss.Open;
    end;ss.OnClientRead(Sender: TObject;Socket: TCustomWinSocket);
    var
      sTemp:string;
      bufRecv:Pointer;
      iRecvLength:integer;
    begin
      if bReadText then
      begin
        sTemp:=Socket.ReceiveText;
        case sTemp[1] of
          MP_QUERY:
            begin
            //在这里拒绝 
              SaveDialog1.FileName:=Copy(sTemp,2,Length(STemp));
              if SaveDialog1.Execute then
              begin 
                Socket.SendText(MP_ACCEPT);
                fsRecv:=TFileStream.Create(SaveDialog1.FileName,fmCreate);
              end
              else Socket.SendText(MP_REFUSE+’去死’);
            end;
          MP_FILEPROPERTY:
            begin
               //要发送StrToInt(Copy(sTemp,2,Length(sTemp))) 次
               //时间进度显示
              Socket.SendText(MP_NEXTWILLBEDATA);
            end;
          MP_NEXTWILLBEDATA:
            begin
              Socket.SendText(MP_DATA);
              bReadText:=false;
            end;
          MP_END:
            begin
              fsRecv.Free
              bReadText:=true;
            end;
          MP_ABORT:
            begin
              fsRecv.Free; 
              bReadText:=true; 
            end;
          MP_CHAT:
            begin
              //Chat Msg
            end;
        end;{of case}
      end
      else begin
        try
          GetMem(bufRecv,2000);//2000 must >iBYTESEND
          Socket.ReceiveBuf(bufRecv^,iRecvLength);
          fsRecv.WriteBuffer(bufRecv^,iRecvLength);
        finally
          FreeMem(bufRecv,2000);
        end;{of try}
        bReadText:=true;
        Socket.SendText(MP_NEXTWILLBEDATA);
      end;
    end;Client程序:
    放上以下控件:edtIPAddress,OpenDialog1,btnConnect,btnSendFile,
    cs. (TClientSocket)btnConnect.OnClick(Sender:TObject);
    begin
    cs.Address:=edtIPAddress.Text;
    cs.Port:=2000;
    cs.Connect;
    end;btnSendFile.OnClick(Sender:TObject);
    begin
    if OpenDialog1.Execute then
    Begin
    cs.Socket.SendText(MP_QUERY+OpenDialog1.FileName);//FileSize???
    end; 
    end;cs.OnRead(Sender: TObject;Socket: TCustomWinSocket);
    var
      sTemp:string;
      bufSend:pointer;
    begin
      sRecv:=Socket.ReceiveText;
      Case sRecv[1] of
        MP_REFUSE:
          ShowMessage(’Faint,be refused!’);
        MP_ACCEPT:
         begin
           fsSend:=TFileStream.Create(OpenDialog1.FileName,fmOpen);
           //iBYTEPERSEND是个常量,每次发送包的大小。
           Socket.SendText(MP_FILEPROPERTY+Trunc(fsSend.Size/iBYTEPERSEND)+1);
         end;
        MP_NEXTWILLBEDATA:
          begin
            Socket.SendText(MP_NEXTWILLBEDATA);
          end;
        MP_DATA:
          begin
            try
              GetMem(bufSend,iBYTEPERSEND+1);
              if (fsSend.Position+1+iBYTEPERSEND) < fsSend.Size then
              begin
                fsSend.Read(bufSend^,iBYTEPERSEND);
                Socket.SendBuf(bufSend^,iBYTEPERSEND);
                fsSend.Free;
              end//普通的发送,大小为iBYTEPERSEND
              else begin
                fsSend.Read(bufSend^,fsSend.Size-fsSend.Position-1);
                Socket.SendBuf(bufSend^,fsSend.Size-fsSend.Position-1);
              end;//最后一次发送,发送剩余的数据
            finally
              FreeMem(bufSend,iBYTEPERSEND+1);
            end;{of try}
          end;
        MP_ABORT:
          begin
            //被取消了:(
            fsSend.Free;
          end;
    end;{of case}
    end;
      

  4.   

    实验了一下  不行  请帮忙!
     zzllabc(清心释累,绝率忘情)  我给你发邮件了 你收到没有啊?
      

  5.   

    楼上的,要啊  我的信箱:[email protected]
      

  6.   

    uses shellapi; 
    copyfile(pchar('newfile.txt'),pcha('//computername/direction/targer.txt'),false);